Answers:
您需要确保为Unicode字符串文字加上N前缀。例如,如果基础数据类型为NVARCHAR
:
CREATE TABLE dbo.t(c NVARCHAR(32));
INSERT dbo.t(c) SELECT 'រៀន';
INSERT dbo.t(c) SELECT 'នរៀ';
INSERT dbo.t(c) SELECT N'រៀន';
SELECT c FROM dbo.t;
SELECT c FROM dbo.t WHERE c = 'រៀន';
SELECT c FROM dbo.t WHERE c = N'រៀន';
结果:
c
----
??? -- not stored correctly
??? -- not stored correctly
រៀន -- stored correctly!
c
----
???
??? -- probably not expected, however all Unicode characters have been changed to ?
c
----
រៀន
对于那些在移动设备或不连续浏览器上显示框字符而不是实际Unicode字符的设备,其外观如下所示:
最大的问题是nvarchar
每个字符使用2个字节,而varchar
使用1 个字节。因此,nvarchar(4000)
使用与varchar(8000)
* 相同的存储空间。
除了所有字符数据需要两倍的存储空间外,这还意味着:
nvarchar
列,以使行保持在8060字节行限制/ 8000字节字符列限制之内。nvarchar(max)
列,它们将比列更快地下推varchar(max)
。nvarchar
列才能保持在900字节的索引键限制之内(我不知道您为什么要使用这么大的索引键,但您永远不会知道)。除此之外nvarchar
,假设您的客户端软件是为处理Unicode而构建的,则使用它们并没有太大不同。SQL Server将透明地将a转换varchar
为nvarchar
,因此,除非您在文字中使用2字节(即Unicode)字符,否则您不必严格要求N前缀作为字符串文字。请注意,强制转换nvarchar
为会varbinary
产生与使用相同的结果varchar
。重要的一点是,您不必立即将每个varchar文字更改为nvarchar文字即可保持应用程序正常运行,这有助于简化流程。
*如果使用数据压缩(轻量级行压缩就足够了,SQL Server 2016 SP1之前需要Enterprise Edition ),由于Unicode压缩(使用SCSU算法),您通常会发现nchar
并nvarchar
占用不超过char
和的空间。varchar
认为以下是主要区别: