只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?
当前回答
如果使用单个字节存储字符,则有256种可能的组合,因此可以保存256种不同的字符。排序规则是一种模式,它定义了字符及其进行比较和排序的规则。
1252,即拉丁语1(ANSI),是最常见的。单字节字符集也不足以存储许多语言使用的所有字符。例如,一些亚洲语言有数千个字符,因此每个字符必须使用两个字节。
Unicode标准
当在网络中使用使用多个代码页的系统时,管理通信变得困难。为了实现标准化,ISO和Unicode联盟引入了Unicode。Unicode使用两个字节来存储每个字符。也就是说,可以定义65536个不同的字符,所以几乎所有的字符都可以被Unicode覆盖。如果两台计算机使用Unicode,每个符号都将以相同的方式表示,不需要转换-这就是Unicode背后的想法。
SQL Server有两类字符数据类型:
非Unicode(char、varchar和文本)Unicode(nchar、nvarchar和ntext)
如果我们需要保存来自多个国家的字符数据,请始终使用Unicode。
其他回答
Jeffrey L Whitledge推荐使用nvarchar,评分约47000
Solomon Rutzky的声誉评分约为33200,建议:不要总是使用NVARCHAR。这是一种非常危险且代价高昂的态度/方法。
varchar和nvarchar SQL Server数据类型之间的主要性能差异是什么?
https://www.sqlservercentral.com/articles/disk-is-cheap-orly-4
两人都享有如此高的声誉,学习型sql server数据库开发人员会选择什么?
如果您的选择不一致,在回答和评论中会有很多关于性能问题的警告。
有关于性能的评论pro/con nvarchar。
有关于性能的评论pro/con varchar。
我对具有数百列的表有一个特殊的要求,这本身可能是不寻常的?
我选择varchar是为了避免接近SQL*服务器2012的8060字节表记录大小限制。
对我来说,nvarchar的使用超过了8060字节的限制。
我还认为应该将相关代码表的数据类型与主中心表的数据匹配。
我曾在南澳大利亚州政府的这个工作场所看到过有经验的数据库开发人员使用varchar列,其中表行数将达到数百万或更多(在这些非常大的表中,如果有nvarchar列的话),因此可能预期的数据行量成为了这一决定的一部分。
你说得对。nvarchar存储Unicode数据,而varchar存储单字节字符数据。除了您已经提到的存储差异(nvarchar需要两倍于varchar的存储空间)之外,更喜欢nvarchar而不是varchar的主要原因是国际化(即以其他语言存储字符串)。
由于SQL Server 2019 varchar列支持UTF-8编码。
因此,从现在开始,不同的是规模。
在转换为速度差异的数据库系统中。
更少的数据=更少的IO+更少的内存=通常速度更快。阅读上面的文章了解数字。
从现在开始在UTF8中使用varchar!
只有当您拥有2048-16383和16384-65535范围内的大量字符时,您才需要测量
虽然NVARCHAR存储Unicode,但您应该考虑借助于排序,您也可以使用VARCHAR并保存本地语言的数据。
想象一下下面的场景。
DB的排序规则是波斯语,您可以在VARCHAR(10)数据类型中保存一个类似“علی”(阿里的波斯语书写)的值。没有问题,DBMS只使用三个字节来存储它。
但是,如果要将数据传输到另一个数据库并查看正确的结果,则目标数据库必须与目标数据库具有相同的排序规则,在本例中为波斯语。
如果目标排序规则不同,则会在目标数据库中看到一些问号(?)。
最后,请记住,如果您使用的是用于本地语言的大型数据库,我建议您使用位置,而不是使用太多空间。
我相信设计会有所不同。这取决于你工作的环境。
与varchar相比,nvarchar使用起来是安全的,因为nvarchar也允许unicode字符,所以我们的代码不会出错(类型不匹配)。当我们在SQL Server查询中使用where条件时,如果我们使用的是=运算符,它会多次抛出错误。可能的原因是我们的映射列将在varchar中定义。如果我们在nvarchar中定义它,这个问题就不会发生。尽管如此,我们还是坚持varchar并避免这个问题,我们最好使用LIKE关键字而不是=。
推荐文章
- 确定记录是否存在的最快方法
- 从现有模式生成表关系图(SQL Server)
- 我如何循环通过一组记录在SQL Server?
- 数据库和模式的区别
- 如何在SQL Server中一次更改多个列
- 外键约束可能导致循环或多条级联路径?
- 如何选择每一行的列值不是独特的
- nvarchar(max)非文本
- 在SQL Server 2008 R2中重命名数据库时出错
- 将数据复制到另一个表中
- 如何在SQL中选择表的最后一条记录?
- 修改列,添加默认约束
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?