我从研究这个问题中学到了一些东西!
在 SQL Server 中
-
nvarchar 占用双倍存储空间,因为它使用两字节字符集
UNICODE UCS-2。
n 定义字符串长度...存储大小(以字节为单位)是输入数据实际长度的两倍 + 2 个字节。
这告诉我为nvarchar 指定的长度肯定是字符数,而不是字节数。
-
varchar是一字节一字符存储,存储单字节非unicode字符数据。
n 定义字符串长度...存储大小是输入数据的实际长度 + 2 个字节。
我会从这两个陈述中推断出varchar 或nvarchar 列的长度指示的数字确实是字符数。
短语length of the data entered 有点模棱两可,但从这两个描述中我认为可以合理地得出结论,它们表示输入的字符数。
如果您有可能接收和存储两字节字符数据,请始终选择nvarchar over varchar,即使性能可能会受到影响。链接的问题和答案有助于了解原因。
底线是SQL Server 将varchar 和nvarchar 列的长度表示为输入的字符数。它将为您处理存储。不用担心字节!
注意:Adding to the confusion 是 Oracle 允许您在本机类型 VARCHAR2 中指定字节长度或字符长度:
Oracle VARCHAR2
随着多字节字符集的使用越来越多的支持
全球化数据库带来的字节问题不再等同于
字符。
VARCHAR2 和 CHAR 类型支持两种指定长度的方法:
以字节为单位:VARCHAR2(10 字节)。这将支持最多 10 个字节的数据,
在一个多字节字符中可能少至两个字符
套。以字符为单位:VARCHAR2(10 个字符)。这将支持最多 10 个
数据的字符,最多可以是 40 字节的信息。
而且看起来默认是字节!
这似乎不仅仅让我们感到困惑:
Oracle varchar2 - bytes or chars
因此,如果您来自 Oracle 世界,您可能会认为这在任何地方都是正确的。如果您来自 SQL Server 世界,您可能不会意识到情况就是这样!
在 SQL Server 中
让我感到困惑的是UTF-8 unicode 字符最多可以占用 6 个字节,而很多只占用 1 个字节!然而,docs 说每个字符恰好占用两个字节。
真的……How many bytes does one Unicode character take?
答案:SQL Server 使用的是UNICODE UCS-2,
使用单个代码值(定义为一个或多个数字表示
一个代码点),每个字符在 0 到 65,535 之间,并且允许
恰好两个字节(一个 16 位字)来表示该值。
这解释了为什么 SQL Server 可以根据字符串的长度拥有特定数量的空间。 所有字符在一个 nvarchar 列中占用两个字节!