Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/268.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# Sql Server-VARCHAR length表示最大字符数还是字节数?_C#_Sql Server_String - Fatal编程技术网

C# Sql Server-VARCHAR length表示最大字符数还是字节数?

C# Sql Server-VARCHAR length表示最大字符数还是字节数?,c#,sql-server,string,C#,Sql Server,String,对于类型为的SQL Server列 VARCHAR(100) 在插入列之前,我希望确保插入的值不大于100是指定它可以存储的最大字符数的数字,还是它可以存储的字符数据字节数 我提出这个问题的原因是,一些unicode特殊字符使用了多个字节。因此,用unicode编码的100个字符的字符串可能会占用100多个字节 由于varchar用于ASCII编码,任何ASCII字符是否可能占用多个字节(这可能需要检查字节长度) (编辑:根据我对这个问题的反馈,我认为varchar应该用于ASCII,而nvar

对于类型为的SQL Server列

VARCHAR(100)

在插入列之前,我希望确保插入的值不大于100是指定它可以存储的最大字符数的数字,还是它可以存储的字符数据字节数

我提出这个问题的原因是,一些unicode特殊字符使用了多个字节。因此,用unicode编码的100个字符的字符串可能会占用100多个字节

由于
varchar
用于ASCII编码,任何ASCII字符是否可能占用多个字节(这可能需要检查字节长度)


(编辑:根据我对这个问题的反馈,我认为
varchar
应该用于ASCII,而
nvarchar
应该用于unicode。)

如果它已经是一个字符串,你只需要确保该字符串的长度不超过100个字符就可以用于适当的编码器——在这种情况下,ASCII表示VarChar,Unicode表示NVarChar)

输出:

'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
    指定的长度肯定是字符数,而不是字节数

  • 是一个字节用于一个字符存储,并存储单字节非unicode字符数据 n定义字符串长度。。。存储大小是输入的数据的实际长度+2字节

    我可以从这两条语句中推断,
    varchar
    nvarchar
    列的长度所指示的数字实际上是字符数

    输入的数据的短语
    长度
    有点含糊不清,但从这两个描述中,我认为有理由得出结论,它们表示输入的字符数

    如果您有可能接收和存储两字节字符数据,请始终选择,即使性能可能会受到影响。链接的问题和答案有助于了解原因

    底线是,SQL Server将
    varchar
    nvarchar
    列的长度表示为输入的字符数。它会帮你保管好仓库的。不要担心字节

    注意:Oracle允许您在本机类型VARCHAR2中指定字节长度或字符长度:

    Oracle VARCHAR2

    随着越来越多地使用多字节字符集来支持 全球化的数据库带来了字节不再等同于 人物

    VARCHAR2和CHAR类型支持两种指定长度的方法:

    字节数:VARCHAR2(10字节)。这将支持多达10字节的数据, 一个多字节字符中可能只有两个字符 设置。字符:VARCHAR2(10个字符)。这将支持多达10个 数据的字符,可能多达40字节的信息

    看起来默认值是字节

    这似乎不仅让我们感到困惑:

    所以,如果你来自甲骨文世界,你可能会认为这在任何地方都是正确的。如果您来自SQL Server世界,您可能没有意识到这一点

    SQL Server中的

    让我困惑的是
    UTF-8
    unicode字符最多可以占用6个字节,而许多字符只占用1个字节!然而,假设每个字符正好占用两个字节

    所以真的

    答:SQL Server正在使用,其中

    使用单个代码值(定义为一个或多个表示 每个字符的代码点)介于0和65535之间,并允许 正好两个字节(一个16位字)表示该值


    这就解释了为什么SQL Server可以根据长度为字符串留出特定的空间所有字符在nvarchar列中占用两个字节

    如果您使用的是unicode,那么您应该改用
    nvarhcar
    。不清楚您所说的“某些特殊字符使用多个字节”是什么意思,因为它不是为ASCII字符设计的。这是适合的编码器,而不是普通的。对于VARCHAR,应改用
    System.Text.Encoding.ASCII
    。这个问题读得不够仔细。我想不出任何多字节ASCII字符,所以我很惊讶OP会问这个问题。谢谢@JohnWu,这很有帮助。后续问题-可能没有任何多字节ASCII字符,但如果将多字节unicode字符插入到
    varchar
    列中,会发生什么情况?您可以尝试将unicode字符插入普通
    varchar
    ,但任何不在代码页上的字符都将成为问号。不推荐。这属于注释。
    if (myString.Length > 100)
    {
        MessageBox.Show("String too long");
        return; 
    }