对于类型的SQL Server列
VARCHAR(100)
在插入列之前,我想确保插入的值不大于100.该数字是指定它可以存储的最大字符数,还是它可以存储的字符数据的字节数?
我问的原因是一些unicode特殊字符使用多个字节。因此,以unicode编码的100个字符串可能占用超过100个字节。
由于varchar
用于ASCII编码,因此任何ASCII字符都可能占用多个字节(可能需要检查字节长度)?
(编辑:根据我对问题的反馈,我看到varchar
应该用于ASCII和nvarchar
用于unicode。)
使用GetByteCount作为适当的编码器 - 在本例中,用于VarChar的ASCII和用于NVarChar的Unicode)。
var s = "This is a string";
var len1 = s.Length;
var len2 = System.Text.Encoding.Unicode.GetByteCount(s);
var len3 = System.Text.Encoding.ASCII.GetByteCount(s);
Console.WriteLine("'{0}' has {1} characters and is {2} bytes with Unicode encoding and {3} bytes with ASCII encoding.", s, len1, len2, len3);
输出:
'This is a string' has 16 characters and is 32 bytes with Unicode encoding and 16 bytes with ASCII encoding.
正确的方法是检查长度
if (myString.Length > 100)
{
MessageBox.Show("String too long");
return;
}
.NET string
已经是Unicode,可以容纳你拥有的任何字符。相反,varchar
数据类型只是ASCII类型,不支持Unicode。你需要做的是将db列声明为nvarchar
,一切都会顺利进行。不要做任何疯狂的事。
我从研究这个问题中学到了一些东西!
在SQL Server中
UNICODE UCS-2
。n定义字符串长度...存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。
这告诉我,为nvarchar
指定的长度肯定是字符数,而不是字节数。
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列中占用两个字节!
如果它已经是一个字符串,你只需要确保字符串的长度不超过100个字符