当前在SQL Server 2012数据库中,我们正在使用varchar,我们想更改该nvarchar。我已经生成了一个脚本来执行此操作。

我的问题是,SQL Server向varchar列与nvarchar列的写入方式有何不同?我们有许多我关心的后端过程。

编辑:
不确定是否有帮助,但是列没有索引,f / k或约束他们。

评论

另请参见dba.stackexchange.com/questions/162113/…

#1 楼

您需要确保为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字符的应用程序,外观如下:



评论


谢谢你如何使用参数?像:从MyTable中选择*,其中EmailAddress = @ emailAddress,在其中我使用Parameters.AddWithValue(“ @ emailAddress”,emailAddress)

– Najeeb
20-4-4在7:32



#2 楼

最大的问题是nvarchar每个字符使用2个字节,而varchar使用1个字节。因此,nvarchar(4000)使用与varchar(8000) *相同的存储空间。很大的存储空间,这还意味着:



您可能不得不使用较短的nvarchar列,以将行保持在8060字节行限制/ 8000字节字符列限制之内。
如果正在使用nvarchar(max)列,它们将比varchar(max)更快地下移行。使用如此大的索引键,但您永远不会知道。)此外,假设您的客户端软件是为处理Unicode而构建的,则使用nvarchar并没有太大不同。 SQL Server将透明地将nvarchar转换为varchar,因此,除非您在文字中使用2字节(即Unicode)字符,否则您不必严格要求N前缀作为字符串文字。请注意,将nvarchar转换为nvarchar会产生与使用varbinary相同的结果。重要的一点是,您不必立即将每个varchar文字更改为nvarchar文字即可保持应用程序正常运行,这有助于简化过程。

*如果使用数据压缩(轻量级行压缩就足够了,SQL Server 2016 SP1之前需要企业版),由于Unicode压缩(使用SCSU算法),您通常会发现varcharnchar占用的空间不超过nvarcharchar

#3 楼

认为以下是主要区别:


Nvarchar存储UNICODE数据。如果需要存储UNICODE或多语言数据,则选择nvarchar。 Varchar存储ASCII数据,应作为正常使用的数据类型。
关于内存使用情况,nvarchar每个字符使用2个字节,而varchar使用1个字节。
将VARCHAR加入NVARCHAR具有相当大的意义
插入数据时可能需要N前缀:INSERT dbo.t(c)SELECTN'ʤʦʨ';
一些专家建议nvarchar始终是因为:由于所有现代操作系统和开发平台在内部使用Unicode,而不是varchar,而是使用nvarchar,它将避免每次您读取或写入数据库时​​都进行编码转换。


#4 楼

从移动数据库到SQL Server 2005的RDP合并复制需要nvarchar。此外,还大量使用了LTrim(),RTrim()和Trim()bc nvarchar不会自动修剪()来减少数据输入的空间,而Varchar却做到了。

我不知道最近几年是否发生了变化,但是nvarchar现在是在生成的数据库中使用的VS Pro 2017上.NET简单成员资格网站登录的标准。

#5 楼

如果在Varchar上使用NVarchar,并且不需要支持MULTI-LINQUAL,则会增加数据库,备份(本地和异地)的存储。现代数据库应同时支持这两者,并且在设计中应考虑任何转化匹配。