nvarchar
是不是只支持多字节字符?如果是这样,使用 varchar
除了存储方面的考虑外,是否还有其他意义呢?
nvarchar
是不是只支持多字节字符?如果是这样,使用 varchar
除了存储方面的考虑外,是否还有其他意义呢?
nvarchar
列可以存储任何Unicode数据,而varchar
列仅限于8位代码页。有些人认为使用varchar
可以节省空间,但我认为这不是正确的答案。代码页不兼容往往会带来麻烦,而Unicode则可解决这种问题。如今磁盘和内存价格便宜,没有必要再浪费时间用代码页来操作。
所有现代操作系统和开发平台都在内部使用Unicode。如果使用nvarchar
而不是varchar
,你就可以避免每次读取或写入数据库时进行编码转换。转换需要时间,而且容易出错。而处理转换错误是一个棘手的问题。
即使与只使用ASCII的应用程序进行接口交互,我仍建议在数据库中使用Unicode。操作系统和数据库排序算法将更好地与Unicode配合使用。使用Unicode避免了与其他系统交互时的转换问题。而且你将为未来做好准备。即使在维护某个历史系统时需要将数据限制为7位ASCII,你仍可以享受完全Unicode存储的一些好处,并验证你的数据是否符合要求。
float
存储到一个int
中,然后说,“当然,小数点会丢失。” 不要这样做。 - user7116我总是使用nvarchar,因为它可以让我构建的任何系统承受几乎任何数据。我的CMS系统意外地支持中文,因为我使用了nvarchar。如今,任何新应用程序不应太关心所需的空间量。
SELECT value$ FROM sys.props$ WHERE name = 'NLS_CHARACTERSET'
找到它。nvarchar以Unicode的格式存储数据,因此如果您要在数据列中存储多语言数据(超过一种语言),则需要使用N variant。
VARCHAR
仅用于非 Unicode 字符,而 NVARCHAR
则可用于 Unicode 和非 Unicode 字符。它们之间的一些其他差异如下所述。
VARCHAR | NVARCHAR | |
---|---|---|
字符数据类型 | 可变长度的非 Unicode 字符 | 可变长度的 Unicode 和非 Unicode 字符(例如日语、韩语和中文) |
最大长度 | 最多可包含8,000个字符 |
最多可包含4,000个字符 |
字符大小 | 每个字符占用1个字节 |
每个 Unicode/非 Unicode 字符占用2个字节 |
存储空间大小 | 实际长度(以字节为单位) | 实际长度的 2 倍(以字节为单位) |
用途 | 当数据长度可变或存在可变长度列,且实际数据总是远小于容量时使用该选项 | 由于存储原因,仅在需要Unicode支持(如日语假名或韩语汉字)时使用该选项。 |
自SQL Server 2019起,varchar列支持UTF-8编码。
因此,从现在开始,差异在于大小。
在一个数据库系统中,这意味着速度的差异。
更少的数据 = 更少的IO + 更少的内存 = 总体上更快的速度。请参阅上述文章了解详细数据。
从现在开始,请使用 UTF8中的varchar!
只有当您的数据中大约占比较高的字符范围为2048-16383和16384-65535时,您才需要进行测量。
我的两分钱
当使用错误的数据类型时,索引可能会失效:
在SQL Server中,如果你对一个VARCHAR列创建了索引并提供给它一个Unicode字符串,那么SQL Server将无法使用该索引。同样的情况也会出现在当你将BigInt提供给一个包含SmallInt的索引列时。即使BigInt的大小足够小以适应SmallInt,SQL Server仍然无法使用该索引。反过来则没有这个问题(当提供SmallInt或Ansi-Code至一个indexed BigInt或NVARCHAR列时)。
不同的DBMS(数据库管理系统)可能具有不同的数据类型:
请注意,每个数据库都有略微不同的数据类型,VARCHAR在各个数据库中的含义并不相同。虽然SQL Server有VARCHAR和NVARCHAR,但Apache/Derby数据库只有VARCHAR,且VARCHAR是以Unicode编码的。
主要nvarchar存储Unicode字符,varchar则存储非Unicode字符。
"Unicode" 是一种16位字符编码方案,允许将来自许多其他语言的字符(如阿拉伯语、希伯来语、中文、日语)编码为单个字符集。
这意味着每个Unicode字符需要使用2个字节进行存储,而每个非Unicode字符只需使用一个字节进行存储。这意味着相比于非Unicode字符,Unicode字符需要双倍的容量来存储。