SQLServer特殊字符/生僻字与varchar

本文涉及的产品
RDS SQL Server Serverless,2-4RCU 50GB 3个月
推荐场景:
云数据库 RDS SQL Server,基础系列 2核4GB
简介:

对于中文版的SQL SERVER,默认安装后使用的默认排序规则为Chinese_PRC_CI_AS,在此排序规则下,使用varchar类型来可以“正常存取”存放中文字符以及一些东南亚国家的字符,同时varchar类型在存放英文字符和数字时比nvarchar节省一半的存储空间,因此很多DBA都习惯使用varchar类型来存放字符数据,但这样便存在一些乱码隐患!
首先是特殊字符如上下标或版权字符,测试Code如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
--准备测试表
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如下:

1
2
3
4
5
6
7
8
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这类前缀匹配的预估时。

 



本文转自yonghu86博客园博客,原文链接:http://www.cnblogs.com/huyong/p/7850491.html,如需转载请自行联系原作者

相关实践学习
使用SQL语句管理索引
本次实验主要介绍如何在RDS-SQLServer数据库中,使用SQL语句管理索引。
SQL Server on Linux入门教程
SQL Server数据库一直只提供Windows下的版本。2016年微软宣布推出可运行在Linux系统下的SQL Server数据库,该版本目前还是早期预览版本。本课程主要介绍SQLServer On Linux的基本知识。 相关的阿里云产品:云数据库RDS SQL Server版 RDS SQL Server不仅拥有高可用架构和任意时间点的数据恢复功能,强力支撑各种企业应用,同时也包含了微软的License费用,减少额外支出。 了解产品详情: https://www.aliyun.com/product/rds/sqlserver
相关文章
|
7月前
|
XML 数据格式
【sqlserver】带分隔符字符串和多行互相转化
【sqlserver】带分隔符字符串和多行互相转化
145 0
|
关系型数据库 MySQL
MySQL中varchar能存多少汉字、数字
MySQL中varchar能存多少汉字、数字
719 0
|
Oracle 关系型数据库 数据库
oracle varchar2 只能存数字,不能存英文和字母
oracle varchar2 只能存数字,不能存英文和字母
95 0
sqlserver 截取字符串中的汉字
sqlserver 截取字符串中的汉字
210 0
|
存储 关系型数据库 MySQL
mysql数据库:varchar类型可以存储多少个汉字,多少个数字
mysql数据库:varchar类型可以存储多少个汉字,多少个数字
1775 0
|
SQL
mssql sqlserver 判断字符串大小写的方法分享
原文:mssql sqlserver 判断字符串大小写的方法分享 摘要:下文讲述使用sql脚本的方法判断字符串为大小写的方法分享,如下所示 实验环境:sqlserver 2008 R2 实现思路: 将字符串转换为大写或小写然后转换为二进制编码, 然后和源字符串做对比。
1433 0
|
SQL
关于sqlserver字符类型查询条件区分大小写
原文:关于sqlserver字符类型查询条件区分大小写 在写sql的查询时 如下:  select * from Users where username='WangE'  select * from Users where username='wange' 上面两条查询语句的结果是一样的,这说明username的条件并没有区分大小写。
1214 0
|
Go 机器学习/深度学习 数据库管理
SQLServer特殊字符/生僻字与varchar
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/78558695 对于中...
1159 0
|
关系型数据库 MySQL 机器学习/深度学习

热门文章

最新文章