SQLServer中NVARCHAR与VARCHAR

1、区别

  • SQLserver 默认排序规则为Chinese_PRC_CI_AS,此排序规则使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时varchar类型在存放英文字符和数字时比nvarchar节省一半的存储空间,但在遇到特殊字符或生僻字时,会产生问题。

Chinese_PRC:针对大陆简体字 UNICODE 的排序规则。

CI:CaseSensitivity:指定不区分大小写。

AS:AccentSensitivity:指定区分重音。

VARCHAR类型的列使用ANSI编码,也即GBK存储数据(不能存储emoji表情)。

NVARCHAR类型的列使用UTF-16编码存储数据(能存储所有Unicode字符,包含emoji表情)。

  • 例如:我是cooper

VARCHAR字段占2×2+6=10个字节的存储空间。

NVARCHAR字段占8×2=16个字节的存储空间。

2、应用

  1. 写入
    1
    2
    3
    4
    5
    6
    7
    CREATE TABLE test (
    [name] [varchar](50) NULL,
    [type] [nvarchar](50) NULL
    )

    INSERT INTO test (name, type)
    VALUES (N'®', N'®')
  • 插入的字符为商标上的®
  • N表示单引号中的字符串使用的是Unicode编码,我们sqlserver引擎会用Unicode的方式去解析内容,而不是用GBK编码的方式。
  1. 查询
    1
    2
    SELECT * FROM TestDemo WHERE order_type LIKE '%®%' --不用N
    SELECT * FROM TestDemo WHERE order_type LIKE N'®%' --用N
    查询结果如下:
    查询结果

总结

  1. 数据库表设计时需要注意是否可能存入特殊字符与生僻字。
  2. 建议使用 NVARCHAR 来存放非英文字符数据。理由:
  • VARCHAR 类型存放特殊字符或生僻字时存在乱码或字符被转变的问题
  • 对于中文字符,使用 VARCHAR 和 NVARCHAR 消耗同样的空间,对于英文字符,使用 VARCHAR 比 NVARCHAR 节省一倍的空间,但随着磁盘成本越来越低,其提升的性能和节省的成本有限。(例外:如果数据中存在大量英文字符和少量非英文字符,则可以结合实际情况考虑 VARCHAR 类型)
  • 使用 VARCHAR 存放非英文字符时,容易生成错误的预估值,尤其在执行 LIKE 这类匹配的预估时。
  • 版权声明: 本博客所有文章除特别声明外,著作权归作者所有。转载请注明出处!
  • Copyrights © 2021-2022 Cooper
  • 访问人数: | 浏览次数:

请我喝杯咖啡吧~

支付宝
微信