varchar
,我们想更改该nvarchar
。我已经生成了一个脚本来执行此操作。我的问题是,SQL Server向
varchar
列与nvarchar
列的写入方式有何不同?我们有许多我关心的后端过程。编辑:
不确定是否有帮助,但是列没有索引,f / k或约束他们。
#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算法),您通常会发现
varchar
和nchar
占用的空间不超过nvarchar
和char
。#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简单成员资格网站登录的标准。
评论
另请参见dba.stackexchange.com/questions/162113/…