版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/78558695
对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时varchar类型在存放英文字符和数字时比nvarchar节省一半的存储空间,因此很多DBA都习惯使用varchar类型来存放字符数据,但这样便存在一些乱码隐患!

首先是特殊字符如上下标或版权字符,测试Code如下:

--准备测试表
DROP TABLE TB1
GO
CREATE TABLE TB1
(
C1 VARCHAR(200),
C2 NVARCHAR(200)
)
GO
--插入测试数据
INSERT INTO TB1(C1,C2)
SELECT N'm²',N'm²'
UNION
SELECT N'®',N'®'
--查询
SELECT C1,
CAST(C1 AS NVARCHAR(200)) AS C1_N,
C2,
CAST(C2 AS VARCHAR(200)) AS C2_V
FROM  TB1

可以明显地看到上标在varchar类型下转换成普通数字2,而版权符号在varchar类型下直接就乱码。

对于这些特殊字符,可能不会被使用到,比如用户姓名字段,那么是不是就可以使用varchar类型了呢?

当然不是,能避开特殊字符,还得考虑“有文化的父母”给子女来点生僻字以展示有文化!!!比如五代十国中南汉的创建者刘䶮就自认为很牛叉,于是自己创了一个“䶮”字,取意为飞龙在天,如此牛叉的意义就不招varchar的“喜欢”,测试code如下:测试结果如下:

可以明显地看到上标在varchar类型下转换成普通数字2,而版权符号在varchar类型下直接就乱码。

对于这些特殊字符,可能不会被使用到,比如用户姓名字段,那么是不是就可以使用varchar类型了呢?

当然不是,能避开特殊字符,还得考虑“有文化的父母”给子女来点生僻字以展示有文化!!!比如五代十国中南汉的创建者刘䶮就自认为很牛叉,于是自己创了一个“䶮”字,取意为飞龙在天,如此牛叉的意义就不招varchar的“喜欢”,测试code如下:

INSERT INTO TB1(C1,C2)
SELECT N'刘䶮',N'刘䶮'SELECT C1,
CAST(C1 AS NVARCHAR(200)) AS C1_N,
C2,
CAST(C2 AS VARCHAR(200)) AS C2_V
FROM  TB1

显示结果如下:

“䶮”字只能在NVARCHAR模式下才能完好地显示哈!

建议使用NVARCHAR来存放非英文字符数据理由:
理由1:VARCHAR类型存放特殊字符或生僻字时存在乱码或字符被转变的问题
理由2:对于中文字符,使用VARCHAR和NVARCHAR消耗同样的空间,对于英文字符,使用VARCHAR比NVARCHAR节省一倍的空间,但随着磁盘成本越来越低,其提升的性能和节省的成本有限。(例外:如果数据中存在大量英文字符和少量非英文字符,则可以考虑VARCHAR类型)
理由3:对于需要国际化的企业,后期将VARCHAR升级为NVARCHAR的成本太高或难以实现
理由4:使用VARCHAR存放非英文字符时,容易生成错误的预估值,尤其在执行LIKE这类前缀匹配的预估时。显示结果如下:

“䶮”字只能在NVARCHAR模式下才能完好地显示哈!
建议使用NVARCHAR来存放非英文字符数据理由:
理由1:VARCHAR类型存放特殊字符或生僻字时存在乱码或字符被转变的问题
理由2:对于中文字符,使用VARCHAR和NVARCHAR消耗同样的空间,对于英文字符,使用VARCHAR比NVARCHAR节省一倍的空间,但随着磁盘成本越来越低,其提升的性能和节省的成本有限。(例外:如果数据中存在大量英文字符和少量非英文字符,则可以考虑VARCHAR类型)
理由3:对于需要国际化的企业,后期将VARCHAR升级为NVARCHAR的成本太高或难以实现
理由4:使用VARCHAR存放非英文字符时,容易生成错误的预估值,尤其在执行LIKE这类前缀匹配的预估时。

SQLServer特殊字符/生僻字与varchar相关推荐

  1. sqlserver中文生僻字乱码问题

    sqlserver中文生僻字乱码问题解决 场景:前端输入生僻字,e.g. 㙍.㮾,存入到数据库为乱码(㙍/-). 解决:修改会存生僻字的字段(一般地址字段)的数据类型为nvarchar,在插入或更新s ...

  2. Delphi6及SqlServer对于生僻字䶮的支持测试

    1.二进制SqlServer正像现场反馈的这样,后台字段只能以nvarhcar类型来保存,并且插入和更新的时候需要在字段前加'N',例: update SF_BRXXK set hzxm=N'䶮' 可 ...

  3. sqlserver varchar 类型存储生僻字,会变成问号,而nvarchar类型不会 是什么原理? (㙍、㮾,䶮)

    在 SQL Server 中,varchar 类型和 nvarchar 类型都用于存储可变长度的字符数据.它们之间的主要区别在于字符编码的方式. varchar 类型使用的是单字节编码(如 ASCII ...

  4. Sqlserver 生僻字

    Sqlserver 生僻字 插入出现生僻字: 加上 N就正确了: 查询方法: 既要显示正确又要正确查询解决办法 select * from db_owner.systemMember where me ...

  5. java mysql 生僻字_mysql/Java服务端对emoji或者生僻字的支持

    最近开发的iOS项目因为需要用户文本的存储,自然就遇到了emoji等表情符号如何被mysql DB支持的问题.困扰了数日,在就要绝望放弃的边缘,终于完成了转换和迁移.在此特别分析和整理,方便更多人. ...

  6. mysql触发器 生僻字_MySQL生僻字插入失败的处理方法(Incorrect string value)

    最近,业务方反馈有个别用户信息插入失败,报错提示类似"Incorrect string value:"\xF0\xA5 ..... " 看这个提示应该是字符集不支持某个生 ...

  7. mysql不识别生僻字_MySQL生僻字插入失败怎么办

    业务方反馈有个别用户信息插入失败,报错提示类似"Incorrect string value:"\xF0\xA5 ..... " 看这个提示应该是字符集不支持某个生僻字造 ...

  8. java生僻字_Android上显示生僻字的方法

    安卓5.0+是可以显示所有(8万多个)Unicode汉字的,本文介绍显示生僻汉字的方法,这个方法也适用于其它特殊字符. Unicode值在0xFFFF以下的(2万多个简体.繁体)汉字早已被广泛支持,所 ...

  9. [微软拼音小技巧] 如何用Unicode输入生僻字

    大家好,我是钱力强,微软拼音输入法的软件工程师.微软拼音有很多很好的功能,长期不为广大用户所了解.在有些时候,这些功能可能真的能够解决你的难题. 日前有新闻报道"山东两百村民因电脑不认生僻字 ...

最新文章

  1. 53个Python库,你必须要试试
  2. 新建QQ群-欢迎加入
  3. BERT源码分析(PART III)
  4. 求两条轨迹间的hausdorff距离_自动控制原理 | 根轨迹法
  5. python文件封装成jar_【Python】Python文件打包为可执行文件
  6. Nmap系列C------OSI二层扫描
  7. java 列表对话框
  8. HTML5物理游戏开发 - 越野山地自行车(三)粉碎自行车
  9. jsp页面中使用javascript获取后台放在request或session中的值
  10. verifycode.php,php验证码|php图片验证码|php image.verifyCode.class.php
  11. 戴尔计算机恢复,DELL计算机恢复镜像问题(已解决)
  12. 数学分析教程(科大)——6.1笔记+习题
  13. WMS(仓库管理系统)
  14. Docker中安装并配置redis
  15. 一小时速成!扁平化名片设计PS教程
  16. 专杀工具编写思路(转)
  17. 自适应螺旋飞行麻雀搜索算法
  18. (超级详细)状态路由协议实验-OSPF(最短路径优先)实验
  19. word另存为pdf时带书签
  20. 【uniapp】根据出生日期计算年龄

热门文章

  1. 论文作者串通抱团、威胁审稿人,ACM Fellow炮轰「同行评审」作弊
  2. 李国杰院士:关于人工智能本质和价值的13个判断,谨防重蹈覆辙!
  3. 美国芯片简史:军方大力扶持下的产物 但一度被日 韩超越
  4. 最全的大数据解决方案(多图)
  5. 普华永道报告:区块链不只是比特币!将改变这8大领域|附下载
  6. 为什么神经网络会把乌龟识别成步枪?现在的 AI 值得信任吗?
  7. 漫画 | 一台 Linux 服务器最多能支撑多少个 TCP 连接?
  8. 想学 Java 的你,来看看这 20 个实战项目!
  9. 腾讯微博即将关停,十年了,你用过吗?
  10. selectepoll