只是nvarchar支持多字节字符吗?如果是这样的话,除了存储问题之外,使用varchars真的有什么意义吗?


当前回答

虽然NVARCHAR存储Unicode,但您应该考虑借助于排序,您也可以使用VARCHAR并保存本地语言的数据。

想象一下下面的场景。

DB的排序规则是波斯语,您可以在VARCHAR(10)数据类型中保存一个类似“علی”(阿里的波斯语书写)的值。没有问题,DBMS只使用三个字节来存储它。

但是,如果要将数据传输到另一个数据库并查看正确的结果,则目标数据库必须与目标数据库具有相同的排序规则,在本例中为波斯语。

如果目标排序规则不同,则会在目标数据库中看到一些问号(?)。

最后,请记住,如果您使用的是用于本地语言的大型数据库,我建议您使用位置,而不是使用太多空间。

我相信设计会有所不同。这取决于你工作的环境。

其他回答

我会说,这取决于情况。

如果您开发一个桌面应用程序,其中操作系统以Unicode(与所有当前的Windows系统一样)工作,并且语言本身支持Unicode(默认字符串为Unicode,如Java或C#),那么使用nvarchar。

如果您开发了一个web应用程序,其中字符串以UTF-8形式出现,语言为PHP,而PHP本身仍然不支持Unicode(在5.x版本中),那么varchar可能是一个更好的选择。

varchar仅用于非Unicode字符,而nvarchar用于Unicode和非Unicode字符。下面给出了它们之间的一些其他差异。

VARCHAR与NVARCHAR

VARCHAR NVARCHAR
Character Data Type Variable-length, non-Unicode characters Variable-length, both Unicode and non-Unicode characters such as Japanese, Korean, and Chinese.
Maximum Length Up to 8,000 characters Up to 4,000 characters
Character Size Takes up 1 byte per character Takes up 2 bytes per Unicode/Non-Unicode character
Storage Size Actual Length (in bytes) 2 times Actual Length (in bytes)
Usage Used when data length is variable or variable length columns and if actual data is always way less than capacity Due to storage only, used only if you need Unicode support such as the Japanese Kanji or Korean Hangul characters.

varchar适用于存储非unicode,这意味着有限的字符。虽然nvarchar是varchar的超集,所以我们可以使用varchar存储哪些字符,但我们可以在不忽略函数的情况下存储更多字符。

有人评论说,现在存储/空间不是问题。即使空间不是一个问题,确定最佳数据类型也应该是一项要求。

这不仅仅是关于存储!“数据移动”,你就知道我要去哪里了!

varchar:可变长度、非Unicode字符数据。数据库排序规则确定使用哪个代码页存储数据。

nvarchar:可变长度Unicode字符数据。取决于用于比较的数据库排序规则。

掌握了这些知识后,使用与输入数据匹配的数据(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的。