SQLServer特殊字符/生僻字与varchar

本文涉及的产品
云数据库 RDS SQL Server,独享型 2核4GB
简介: 版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/chinahuyong/article/details/78558695 对于中...
版权声明:本文为博主原创文章,未经博主允许不得转载。 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这类前缀匹配的预估时。





相关实践学习
使用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
相关文章
|
9月前
|
存储 SQL
Sql Server 中char、nchar、varchar、nvarchar这几种数据类型的区别
Sql Server 中char、nchar、varchar、nvarchar这几种数据类型的区别
138 0
|
存储 SQL 关系型数据库
浅谈SQL Server、MySQL中char,varchar,nchar,nvarchar区别
最近一次的面试中,被面试官问到varchar和nvarchar的区别,脑海里记得是定长和可变长度的区别,但却没能说出来。后来,在网上找了下网友总结的区别。在这里做个备忘录: 一,SQL Server中char,varchar,nchar,nvarchar的区别(援引:https://www.cnblogs.com/limeiky/p/5313312.html) 1,定义:   char:    固定长度,存储ANSI字符,不足的补英文半角空格。
3072 0
|
Go 机器学习/深度学习 数据库管理
|
SQL
常量字符在sql server里面为varchar(n) 1<=n<=8000
背景      测试8000个字节后,varchar(max)会被切到溢出页中 问题      在测试时发现  SELECT DATALENGTH (  REPLICATE ('a' , 9000))  长度只能为8000 原因      常量字符在sql server里面为varch...
526 0
|
8天前
|
SQL 人工智能 算法
【SQL server】玩转SQL server数据库:第二章 关系数据库
【SQL server】玩转SQL server数据库:第二章 关系数据库
51 10
|
1月前
|
SQL 数据库 数据安全/隐私保护
Sql Server数据库Sa密码如何修改
Sql Server数据库Sa密码如何修改

相关实验场景

更多