只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?
当前回答
nvarchar列可以存储任何Unicode数据。varchar列限制为8位代码页。有些人认为应该使用varchar,因为它占用更少的空间。我认为这不是正确的答案。代码页不兼容性是一个难题,Unicode是解决代码页问题的良方。现在磁盘和内存都很便宜,真的没有理由再浪费时间摆弄代码页了。
所有现代操作系统和开发平台都在内部使用Unicode。通过使用nvarchar而不是varchar,可以避免每次读取或写入数据库时进行编码转换。转换需要时间,而且容易出错。从转换错误中恢复是一个非常重要的问题。
如果您使用的是仅使用ASCII的应用程序,我仍然建议在数据库中使用Unicode。操作系统和数据库排序算法将更好地使用Unicode。Unicode在与其他系统接口时避免了转换问题。你将为未来做准备。您可以始终验证您的数据是否仅限于7位ASCII,无论您要维护的是什么遗留系统,即使您享受完全Unicode存储的一些好处。
其他回答
Varchar(n)和nvarchar(n)之间的主要区别是:
Varchar(可变长度,非Unicode字符数据)大小最大为8000。
它是可变长度数据类型用于存储非Unicode字符每个字符占用1字节的空间
Nvarchar:可变长度Unicode字符数据。
它是可变长度数据类型用于存储Unicode字符。数据以Unicode编码存储。每一个支持语言。(例如阿拉伯语、德语、印地语等)
你说得对。nvarchar存储Unicode数据,而varchar存储单字节字符数据。除了您已经提到的存储差异(nvarchar需要两倍于varchar的存储空间)之外,更喜欢nvarchar而不是varchar的主要原因是国际化(即以其他语言存储字符串)。
我的两分钱
如果不使用正确的数据类型,索引可能会失败:在SQL Server中:当您在VARCHAR列上有一个索引并将其呈现为Unicode字符串时,SQL Server不会使用该索引。当您向包含SmallInt的索引列提供BigInt时,也会发生同样的情况。即使BigInt小到可以成为SmallInt,SQL Server也无法使用索引。另一方面,您没有这个问题(当向索引的BigInt或NVARCHAR列提供SmallInt或Ansi代码时)。不同DBMS(数据库管理系统)的数据类型可能有所不同:要知道,每个数据库都有稍微不同的数据类型,VARCHAR并不意味着所有地方都是相同的。虽然SQL Server有VARCHAR和NVARCHAR,但Apache/DDerby数据库只有VARCHAR,而VARCHAR是Unicode的。
由于SQL Server 2019 varchar列支持UTF-8编码。
因此,从现在开始,不同的是规模。
在转换为速度差异的数据库系统中。
更少的数据=更少的IO+更少的内存=通常速度更快。阅读上面的文章了解数字。
从现在开始在UTF8中使用varchar!
只有当您拥有2048-16383和16384-65535范围内的大量字符时,您才需要测量
我会说,这取决于情况。
如果您开发一个桌面应用程序,其中操作系统以Unicode(与所有当前的Windows系统一样)工作,并且语言本身支持Unicode(默认字符串为Unicode,如Java或C#),那么使用nvarchar。
如果您开发了一个web应用程序,其中字符串以UTF-8形式出现,语言为PHP,而PHP本身仍然不支持Unicode(在5.x版本中),那么varchar可能是一个更好的选择。
推荐文章
- 确定记录是否存在的最快方法
- 从现有模式生成表关系图(SQL Server)
- 我如何循环通过一组记录在SQL Server?
- 数据库和模式的区别
- 如何在SQL Server中一次更改多个列
- 外键约束可能导致循环或多条级联路径?
- 如何选择每一行的列值不是独特的
- nvarchar(max)非文本
- 在SQL Server 2008 R2中重命名数据库时出错
- 将数据复制到另一个表中
- 如何在SQL中选择表的最后一条记录?
- 修改列,添加默认约束
- 在存储过程中使用“SET XACT_ABORT ON”有什么好处?
- 如何检查SQL Server文本列是否为空?
- 如何创建一个SQL Server函数“连接”多行从一个子查询到一个单独的分隔字段?