只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?
当前回答
varchar适用于存储非unicode,这意味着有限的字符。虽然nvarchar是varchar的超集,所以我们可以使用varchar存储哪些字符,但我们可以在不忽略函数的情况下存储更多字符。
有人评论说,现在存储/空间不是问题。即使空间不是一个问题,确定最佳数据类型也应该是一项要求。
这不仅仅是关于存储!“数据移动”,你就知道我要去哪里了!
其他回答
虽然NVARCHAR存储Unicode,但您应该考虑借助于排序,您也可以使用VARCHAR并保存本地语言的数据。
想象一下下面的场景。
DB的排序规则是波斯语,您可以在VARCHAR(10)数据类型中保存一个类似“علی”(阿里的波斯语书写)的值。没有问题,DBMS只使用三个字节来存储它。
但是,如果要将数据传输到另一个数据库并查看正确的结果,则目标数据库必须与目标数据库具有相同的排序规则,在本例中为波斯语。
如果目标排序规则不同,则会在目标数据库中看到一些问号(?)。
最后,请记住,如果您使用的是用于本地语言的大型数据库,我建议您使用位置,而不是使用太多空间。
我相信设计会有所不同。这取决于你工作的环境。
我看了一下答案,许多人似乎建议使用nvarchar而不是varchar,因为空间不再是问题,所以启用Unicode以获得很少的额外存储不会有什么害处。嗯,当你想在列上应用索引时,这并不总是正确的。SQL Server对可以索引的字段的大小限制为900字节。因此,如果您有一个varchar(900),您仍然可以对其进行索引,但不能对varchar(901)进行索引。使用nvarchar,字符数减半,因此可以索引到nvarchar(450)。因此,如果您确信不需要nvarchar,我不建议使用它。
一般来说,在数据库中,我建议您坚持所需的大小,因为您可以随时扩展。例如,一位同事曾经认为,对列使用nvarchar(max)没有害处,因为我们在存储方面完全没有问题。后来,当我们试图对此列应用索引时,SQL Server拒绝了这一点。然而,如果他甚至从varchar(5)开始,我们可以简单地将其扩展到我们需要的内容,而不会出现这样的问题,这将要求我们制定一个字段迁移计划来解决这个问题。
nvarchar列可以存储任何Unicode数据。varchar列限制为8位代码页。有些人认为应该使用varchar,因为它占用更少的空间。我认为这不是正确的答案。代码页不兼容性是一个难题,Unicode是解决代码页问题的良方。现在磁盘和内存都很便宜,真的没有理由再浪费时间摆弄代码页了。
所有现代操作系统和开发平台都在内部使用Unicode。通过使用nvarchar而不是varchar,可以避免每次读取或写入数据库时进行编码转换。转换需要时间,而且容易出错。从转换错误中恢复是一个非常重要的问题。
如果您使用的是仅使用ASCII的应用程序,我仍然建议在数据库中使用Unicode。操作系统和数据库排序算法将更好地使用Unicode。Unicode在与其他系统接口时避免了转换问题。你将为未来做准备。您可以始终验证您的数据是否仅限于7位ASCII,无论您要维护的是什么遗留系统,即使您享受完全Unicode存储的一些好处。
我的两分钱
如果不使用正确的数据类型,索引可能会失败:在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的。
如果使用单个字节存储字符,则有256种可能的组合,因此可以保存256种不同的字符。排序规则是一种模式,它定义了字符及其进行比较和排序的规则。
1252,即拉丁语1(ANSI),是最常见的。单字节字符集也不足以存储许多语言使用的所有字符。例如,一些亚洲语言有数千个字符,因此每个字符必须使用两个字节。
Unicode标准
当在网络中使用使用多个代码页的系统时,管理通信变得困难。为了实现标准化,ISO和Unicode联盟引入了Unicode。Unicode使用两个字节来存储每个字符。也就是说,可以定义65536个不同的字符,所以几乎所有的字符都可以被Unicode覆盖。如果两台计算机使用Unicode,每个符号都将以相同的方式表示,不需要转换-这就是Unicode背后的想法。
SQL Server有两类字符数据类型:
非Unicode(char、varchar和文本)Unicode(nchar、nvarchar和ntext)
如果我们需要保存来自多个国家的字符数据,请始终使用Unicode。
推荐文章
- 选项(RECOMPILE)总是更快;为什么?
- 设置数据库从单用户模式到多用户
- 我如何转义一个百分比符号在T-SQL?
- SQL Server恢复错误-拒绝访问
- 如何在SQL Server Management Studio中查看查询历史
- SQL Server索引命名约定
- 可以为公共表表达式创建嵌套WITH子句吗?
- SQL Server的NOW()?
- 在SQL Server中截断(不是四舍五入)小数位
- 如何在SQL Server数据库中更改列数据类型而不丢失数据?
- 保持简单,以及如何在一个查询中执行多个CTE
- 如何使用TSQL截断数据库中的所有表?
- 如何从表中导出所有数据到可插入的sql格式?
- 我如何执行插入和返回插入的身份与Dapper?
- 索引中列的顺序有多重要?