`

转:mysql 的charaset 与 collation

 
阅读更多

http://zhongwei-leg.iteye.com/blog/899227

使用 mysql 创建数据表的时候, 总免不了要涉及到 character set 和 collation 的概念, 之前不是很了解。

 

这两天不是很忙, 就自己整理了一下。

 

 

先来看看 character set 和 collation 的是什么?

&. character set, 即字符集。

我们常看到的 utf-8, GB2312, GB18030 都是相互独立的 character set. 即对 Unicode 的一套编码。

 

那么如何理解 unicode 与 utf-8, GB2312 的区别呢?
打个比方,你眼前有一个苹果,在英文里称之为 apple, 而在中文里称之为苹果。
苹果这个实体的概念就是 unicode , 而 utf-8, GB2312 可以认为就是不同语言对苹果的不同称谓,本质上都是在描述苹果这个物。

 

&. collation, 即比对方法。

用于指定数据集如何排序,以及字符串的比对规则。(这样说可能比较抽象,后面会详细解释。)

 

 

character set 与 collation 的关系

 

软件国际化是大势所趋, 所以 unicode 是国际化最佳的选择。当然为了提高性能,有些情况下还是使用 latin1 比较好。

 

mysql 有两个支持 unicode 的 character set:

1. ucs2: 使用 16 bits 来表示一个 unicode 字符。

2. utf8: 使用 1~3 bytes 来表示一个 unicode 字符。

 

选择哪个 character set 视情况而定,例如 utf8 表示 latin 字符只需要一个字节,所以当用户数据大部分为英文等拉丁字符时,使用 utf8 比较节省数据库的存储空间。据说 SQL Server 采用的是 ucs2, 我表示怀疑。

 

每个 character set 会对应一定数量的 collation. 查看方法是在 mysql 的 console 下输入:

 

Java代码   收藏代码
  1. mysql> show collation;  

 

我们会看到这样的结果:

 

 

collation 名字的规则可以归纳为这两类:

1. <character set>_<language/other>_<ci/cs>

2. <character set>_bin

 

例如:

utf8_danish_ci

 

ci 是 case insensitive 的缩写, cs 是 case sensitive 的缩写。即,指定大小写是否敏感。

奇怪的是 utf8 字符集对应的 collation 居然没有一个是 cs 的。

 

 

 

那么 utf8_general_ci, utf8_unicode_ci, utf8_danish_ci 有什么区别? 他们各自存在的意义又是什么?

 

同一个 character set 的不同 collation 的区别在于排序、字符春对比的准确度(相同两个字符在不同国家的语言中的排序规则可能是不同的)以及性能。

 

例如:

utf8_general_ci 在排序的准确度上要逊于 utf8_unicode_ci, 当然,对于英语用户应该没有什么区别。但性能上(排序以及比对速度)要略优于 utf8_unicode_ci. 例如前者没有对德语中 

 

ß = ss

 

的支持。

 

而 utf8_danish_ci 相比 utf8_unicode_ci 增加了对丹麦语的特殊排序支持。

 

 

补充:

 

1. 当表的 character set 是 latin1 时,若字段类型为 nvarchar, 则字段的字符集自动变为 utf8.

可见 database character set, table character set, field character set 可逐级覆盖。

 

2. 在 ci 的 collation 下,如何在比对时区分大小写:

写道
mysql> select * from pet;
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)

mysql> select * from pet where name = 'whistler';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| Whistler | Gwen | bird | NULL | 1997-12-09 | NULL |
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
2 rows in set (0.00 sec)

mysql> select * from pet where binary name = 'whistler';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

mysql> select * from pet where name = binary 'whistler';
+----------+-------+---------+------+------------+-------+
| name | owner | species | sex | birth | death |
+----------+-------+---------+------+------------+-------+
| whistler | Gwen | bird | NULL | 1988-09-25 | NULL |
+----------+-------+---------+------+------------+-------+
1 row in set (0.00 sec)

 

推荐使用

 

mysql> select * from pet where name = binary 'whistler';

 

这样可以保证当前字段的索引依然有效, 而

 

mysql> select * from pet where binary name = 'whistler';

 

会使索引失效。

 

分享到:
评论

相关推荐

    解决mysql不能插入中文Incorrect string value

    选项default-charaset-set=utf8; 然后创建一个数据表 create table a_table(b varchar(255) not null); insert into a_table values(‘北京’); 这个时候插入的是中文,系统会报告错误:Incorrect string value: ‘\...

    基于忆阻神经网络的图像边缘检测的FPGA硬件实现.pdf

    基于忆阻神经网络的图像边缘检测的FPGA硬件实现.pdf

    MASTG Mobile Application Security Testing Guide 中文版本 | 移动应用安全性与逆向工程技术的全面指南:深入探讨OWASP MASTG v1.7.0

    内容概要:本文深入解读了OWASP MASTG v1.7.0的移动应用安全测试指南,涵盖应用源代码完整性检查、文件存储完整性检查、反编译与逆向工程、权限管理和证书固定等多个方面。文章强调移动应用程序面临的常见威胁及应对措施,并详细介绍反汇编、文件完整性检测、调试技术和证书固定的绕过方法。这些主题旨在帮助安全研究人员深入了解并加强移动应用程序的安全防护。适用人群:从事信息安全和移动应用开发的专业人士,尤其是负责安全测试和审计的工程师。 使用场景及目标:该指南主要应用于移动应用安全性评估、开发和渗透测试等领域。帮助企业和团队识别、防范各类安全隐患,确保移动应用程序的安全性和合规性。其他说明:本文还涉及大量实战技巧和技术细节,如ADB命令、逆向工程工具(radare2、IDA Pro等)的具体应用方法、动态与静态分析工具的选择,为移动安全研究人员提供了详尽的实际操作参考资料。 适合人群:具备一定编程基础,工作1-3年的研发人员。对信息安全领域有兴趣的学习者也可从中受益匪浅。 适用场合及目标:适用于移动应用开发、测试、维护等全流程,特别是关注安全性评估、漏洞挖掘、逆向工程及防御对策的企业和个人开发者。 其他说明:文章内容丰富,覆盖广泛的主题,既包含了理论知识又包含了大量的实用技术,能够满足不同类型用户的需求。无论是希望提升自我技术水平的一般技术人员,还是需要进行专业安全测评的专业人士都可以从此份文档中获益。

    基于java+ssm+mysql的图书管理借阅系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    可控电抗器的有限元分析.pdf

    可控电抗器的有限元分析.pdf

    主窗体代码.txt

    主窗体代码

    基于java+ssm+mysql的留守儿童信息管理系统 源码+数据库+论文(高分毕设项目).zip

    项目已获导师指导并通过的高分毕业设计项目,可作为课程设计和期末大作业,下载即用无需修改,项目完整确保可以运行。 包含:项目源码、数据库脚本、软件工具等,该项目可以作为毕设、课程设计使用,前后端代码都在里面。 该系统功能完善、界面美观、操作简单、功能齐全、管理便捷,具有很高的实际应用价值。 项目都经过严格调试,确保可以运行!可以放心下载 技术组成 语言:java 开发环境:idea 数据库:MySql8.0 部署环境:Tomcat(建议用 7.x 或者 8.x 版本),maven 数据库工具:navicat

    总变分 L1 保真度盐和胡椒去噪与自适应正则化参数Matlab代码.rar

    1.版本:matlab2014/2019a/2024a 2.附赠案例数据可直接运行matlab程序。 3.代码特点:参数化编程、参数可方便更改、代码编程思路清晰、注释明细。 4.适用对象:计算机,电子信息工程、数学等专业的大学生课程设计、期末大作业和毕业设计。

    PhotoshopCC2015.zip

    PhotoshopCC2015

    基于RTL-SDR的ADS-B应答信号处理平台的研究与实现.pdf

    基于RTL-SDR的ADS-B应答信号处理平台的研究与实现.pdf

    docker-latest-logrotate-1.13.1-58.git87f2fab.el7.centos.x64-86.rpm.tar.gz

    1、文件内容:docker-latest-logrotate-1.13.1-58.git87f2fab.el7.centos.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/docker-latest-logrotate-1.13.1-58.git87f2fab.el7.centos.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    docbook-style-dsssl-1.79-18.el7.x64-86.rpm.tar.gz

    1、文件内容:docbook-style-dsssl-1.79-18.el7.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/docbook-style-dsssl-1.79-18.el7.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    1代码.txt

    1代码

    QR码图像识别的关键技术.pdf

    QR码图像识别的关键技术.pdf

    dpdk-tools-18.11.8-1.el7-8.x64-86.rpm.tar.gz

    1、文件内容:dpdk-tools-18.11.8-1.el7_8.rpm以及相关依赖 2、文件形式:tar.gz压缩包 3、安装指令: #Step1、解压 tar -zxvf /mnt/data/output/dpdk-tools-18.11.8-1.el7_8.tar.gz #Step2、进入解压后的目录,执行安装 sudo rpm -ivh *.rpm 4、安装指导:私信博主,全程指导安装

    2025最新网格员知识题库及答案.docx

    2025最新网格员知识题库及答案.docx

    2025最新驾照C1证考试科目一必考题库附含答案.docx

    2025最新驾照C1证考试科目一必考题库附含答案.docx

    按键密码恢复程序源代码ZQ.zip

    按键密码恢复程序源代码ZQ

    sevenzip.19.0.0.nupkg

    sevenzip.19.0.0

    ndp461-devpack-kb3105179-enu.exe

    ndp461-devpack-kb3105179-enu

Global site tag (gtag.js) - Google Analytics