论SqlServer中char、varchar、nvarcahr和MySQL中char、varcahr的区别

时间:2022-01-28 07:10:00

MySQL:

    char定义存储字符,实际存储也是按照字符形式存储,大小char(255个字符),注意不是字节。

 在此说下字符与字节的区别?

     字节是计算机中存储信息的单位,一个字节占八位,字符是A、B、C等以及一些符号,一般在计算机中用一个字节表示,也就是说一般占一个字节,但还有不一般,根据特定编码每个字符所占的字节数不同,就如在gbk,gb2312中一个汉字占两个字节,但国际通用编码格式utf-8中一个汉字占3个字节。

因此char在utf8编码下最多可存储255*3个字节的数据,无论是单独的一个汉字,还是英文字母都是一个字符,只是所占字节不同而已,Soga,char(255个字符),

不管是sqlserver还是MySQL存储,如果存储的字符没有255个会以英文空格字符的形式填满。这就是所谓的定长。

     下面说说varchar(0-65532个字节)定义的是字符,但是实际以字节的形式进行存储,最多可以存储Max(65532)个字节,因此在utf8编码形式下最多存储65532/3-1个字符,在gbk编码下,最多存储65532/2-1,为什么会减一呢?因为MySQL的机制会留1-3个字节来存储该字符串的长度。多了这个用来记录长度的结果就可以做到动态变化,而不需要像char那样用空格填充剩余空间,减少内存消耗,但同样也增加了内耗,影响了性能。

举个例子:定义了name字段:varchar(60),为其填充数据张三,则只占用6个字节,剩余54个字节未被占用,上例如果定义name字段为char(60),同样填充数据张三的话,虽然也是占用6个字节,但剩余58个字符会用空格填充,实际占用60个字符所耗空间

sqlserver:

   先说说nvarchar和varcahr的区别:

    varchar:  可变长度,存储ANSI字符,根据数据长度自动变化。

    nvarchar: 可变长度,存储Unicode字符,根据数据长度自动变化。

    nvarchar(n) :包含 n个字符的可变长度 Unicode 字符数据。n 的值必须介于 1  与  4,000 之间。字节的存储大小是所输入字符个数的两倍。

     varchar[(n)]:长度为 n 个字节的可变长度且非 Unicode的字符数据。n 必须是一个介于 1 和 8,000之间的数值。存储大小为输入数据的字节的实际长度,而不是 n 个字节

从以上可以看出nvarchar是以字符方式存储, 因为用Unicode编码,这里大家可以看看这篇博客:各种编码的详解:http://blog.csdn.net/lvxiangan/article/details/8151670

因此可以说是规定nvarchar是双字节存储,不管你存储的是汉字还是英文字母都是占两个字节,

      分析优缺点: 

     优点:判断字符串的时候可以不需要考虑中英文两种字符的差别,可以避免程序中乱码的问题。

           缺点:存储英文字符会增大一倍的存储空间.但是在存储代价已经很低廉的情况下,优先考虑兼容性会给你带来更多好处的,效率没有varchar高。

  char在此不做多解释与MySQL情况一致。

     一般使用情况说明:

  存储的数据长度确定如电话号码,编码等固定的,而且不包中文的,可以选择char类型。

  存储的数据长度不确定,存储只有英文、数字的最好用varchar

  存储的数据长度不确定,也有可能有中文,可以选择nvarchar类型。