SQL中N的作用?

SQL中N的作用?

exec sp_executesql N'SELECT TOP 1 ISNULL(vDefine1,'''') AS vMonth, dtBegin, dtEnd FROM SM_ActMonth WHERE vActID=@P1 AND bCarryForward=@P2 ORDER BY iListID DESC
', N'@P1 varchar(3),@P2 bit', '001', 1

exec sp_executesql N'SELECT * FROM KEHU WHERE KHDM>=@P1 AND ZK=@P2',N'@P1 VARCHAR(20),@P2 Numeric(18,6)','001',1


加上N代表存入数据库时以 Unicode 格式存储。

N'string' 表示string是个Unicode字符串

--------------------------------------------------------------------------

使用 Unicode 数据
Unicode 标准为全球商业领域中广泛使用的大部分字符定义了一个单一编码方案。所有的计算机都用单一的 Unicode 标准 Unicode 数据中的位模式一致地翻译成字符。这保证了同一个位模式在所有的计算机上总是转换成同一个字符。数据可以随意地从一个数据库或计算机传送到另一个数据库或计算机,而不用担心接收系统是否会错误地翻译位模式。

对于用一个字节编码每个字符的数据类型,存在的问题之一就是此数据类型只能表示 256 个不同的字符。这就迫使对于不同的字母表(例如相对较小的欧洲字母表)采用多重编码规格(或者代码页)。而且也不可能处理象日文汉字或韩国文字这样具有数千个字符的字母表。

每个 Microsoft® SQL Server? 排序规则都有一个对表示 char、varchar 和 text 值中的每个字符定义位模式进行定义的代码页。可为个别的列和字符常量指派不同的代码页。客户端计算机使用与操作系统区域设置相关联的代码页解释字符位模式。有很多种不同的代码页。一些字符出现在某些代码页上,但并不出现在其它的代码页上。某些字符在一些代码页上用一个位模式定义,而在其它的代码页上却用另一个位模式定义。当您设计必须处理不同语言的国际性系统时,为了满足不同国家/地区的语言需求,给所有的计算机挑选代码页就变得困难了。要保证每一台计算机与使用不同代码页的系统交互时都进行正确的翻译也是困难的。

Unicode 规格通过采用两个字节编码每个字符使这个问题迎刃而解。转换最通用商业语言的单一规格具有足够多的 2 字节的模式 (65,536)。因为所有的 Unicode 系统均一致地采用同样的位模式来代表所有的字符,所以当从一个系统转到另一个系统时,将不会存在未正确转换字符的问题。通过在整个系统中使用 Unicode 数据类型,可尽量减少字符转换问题。

在 Microsoft SQL Server 中,以下数据类型支持 Unicode 数据:

nchar

nvarchar

ntext


说明  这些数据类型的前缀 n 来自 SQL-92 标准中的 National(Unicode)数据类型。

nchar、nvarchar 和 ntext 的用法分别与 char、varchar 和 text 的用法一样,但在以下方面不同:

Unicode支持的字符范围更大。

存储 Unicode 字符所需要的空间更大。

nchar 和 nvarchar 列最多可以有 4,000 个字符,而不象 char 和 varchar 字符那样可以有 8,000 个字符。

Unicode 常量使用 N 开头来指定:N'A Unicode string'。

所有 Unicode 数据都使用相同的 Unicode 代码页。排序规则不控制用于 Unicode 列的代码页,仅控制比较规则和是否区分大小写等特性。

### SQL Server 中文显示为问号的解决方案 在SQL Server中,中文显示为问号的问题通常是由于字符编码或数据类型设置不正确引起的。以下是详细的解决方法: #### 1. 确保列的数据类型支持Unicode 如果数据库表中的列使用的是`VARCHAR`类型,则可能会导致中文插入后显示为问号。这是因为`VARCHAR`只能存储单字节字符,而中文属于多字节字符。应将列的数据类型更改为`NVARCHAR`以支持Unicode字符[^4]。 ```sql -- 修改表结构,将VARCHAR列改为NVARCHAR ALTER TABLE TableName ALTER COLUMN ColumnName NVARCHAR(255); ``` #### 2. 检查并修改排序规则 数据库或列的排序规则(Collation)可能不支持中文字符,这会导致插入的中文被替换为问号。可以通过以下步骤检查和修改排序规则[^1]: - **检查当前数据库的排序规则**: ```sql SELECT name, collation_name FROM sys.databases WHERE name = 'YourDatabaseName'; ``` - **修改数据库的排序规则**: 如果需要更改整个数据库的排序规则,可以使用以下语句。注意,此操作可能需要独占锁定数据库,因此请确保没有其他用户正在访问该数据库[^3]。 ```sql ALTER DATABASE YourDatabaseName COLLATE Chinese_PRC_CI_AS; ``` #### 3. 在插入语句中显式指定N前缀 当插入中文数据时,应在字符串前加上`N`前缀,以指示SQL Server将其视为Unicode字符串[^2]。 ```sql INSERT INTO TableName (ColumnName) VALUES (N'中文内容'); ``` #### 4. 检查客户端与服务器之间的编码配置 如果客户端与服务器之间的编码不匹配,也可能导致中文显示为问号。确保连接字符串中包含正确的编码设置。例如,在使用ADO.NET连接SQL Server时,可以在连接字符串中添加`Charset=UTF8`[^4]。 ```csharp string connectionString = "Server=myServerAddress;Database=myDataBase;User Id=myUsername;Password=myPassword;Charset=UTF8;"; ``` #### 5. 验证数据库和列的默认语言 有时,默认语言设置不当也会导致字符显示问题。可以通过以下查询检查数据库和列的默认语言,并根据需要进行调整[^3]。 ```sql -- 查看数据库默认语言 SELECT name, default_language_name FROM sys.databases WHERE name = 'YourDatabaseName'; -- 查看列的默认语言 SELECT name, collation_name FROM sys.columns WHERE object_id = OBJECT_ID('TableName') AND name = 'ColumnName'; ``` ### 示例代码 以下是一个完整的示例,展示如何创建支持中文的表、插入中文数据并验证结果: ```sql -- 创建支持Unicode的表 CREATE TABLE ExampleTable ( ID INT, ChineseText NVARCHAR(255) ); -- 插入中文数据 INSERT INTO ExampleTable (ID, ChineseText) VALUES (1, N'你好,世界'); -- 查询数据 SELECT * FROM ExampleTable; ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值