Sql Server - VARCHAR长度是否表示最大字符数或字节数?

时间:2017-12-14 03:28:52

标签: c# sql-server string

对于

类型的SQL Server列

select count(`order_id`) as cnt from ( select `order_id` from `room_bookings` where `room_id` = 3 and `day_id` = 20180201 group by `order_id` ) as b;

在插入列之前,我想确保插入的值不大于100. 该数字是否指定了它可以存储的最大字符数,或者是数字它可以存储的字符数据字节

我问的原因是某些unicode特殊字符使用多个字节。因此,以unicode编码的100个字符串可能占用超过100个字节。

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

(编辑:根据我对此问题的反馈,我看到varchar应该用于ASCII,varchar用于unicode。)

4 个答案:

答案 0 :(得分:6)

使用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.

答案 1 :(得分:0)

正确的方法是检查长度

if (myString.Length > 100)
{
    MessageBox.Show("String too long");
    return; 
}

.NET string已经是Unicode,可以保存您拥有的任何字符。 相反,varchar数据类型只是ASCII类型,不支持Unicode。您需要做的是将db列声明为nvarchar,一切都将顺利进行。不要做任何疯狂的事。

答案 2 :(得分:0)

我从研究这个问题中学到了一些东西!

在SQL Server中

  1. nvarchar占用了两倍的存储空间,因为它使用了两个字节的字符集UNICODE UCS-2
  2.   

    n定义字符串长度...存储大小(以字节为单位)是输入数据的实际长度的两倍+ 2个字节。

    这告诉我,为nvarchar指定的长度肯定是字符数,而不是字节数。

    1. varchar一个字符存储一个字节,并存储单字节非Unicode字符数据。
    2.   

      n定义字符串长度...存储大小是输入数据的实际长度+ 2个字节。

      我会从这两个陈述中推断,varcharnvarchar列长度的数字确实是字符数。

      短语length of the data entered有些含糊不清,但从这两个描述中我认为可以合理地断定它们是指输入的字符数。

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

      底线是 SQL Server表示varcharnvarchar列的长度为输入的字符数。它将为您处理存储。不要担心字节!

      注意: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列中占用两个字节!

答案 3 :(得分:-1)

如果它已经是一个字符串,你只需要确保该字符串的长度不超过100个字符