MySQL字符集与排序规则

  • MySQL支持的字符集
    • 字符集与排序规则
    • 排序规则的命名
  • 使用字符集与排序规则
    • 服务器级别的字符集
    • 数据库级别的字符集
    • 表级别的字符集
    • 列级别的字符集
    • 字符串级别的字符集
  • National字符集

字符集(character set)可以理解为符号(symbols)与编码(encoding)的集合,而排序规则(collation)则是指用来比较字符集中所有字符的规则。MySQL支持多种字符集,用于存储数据、比较字符串、以及客户端程序与MySQL服务器之间的通信。MySQL支持在以下五个层级设定字符集:

  • 服务器(server
  • 数据库(database
  • 表(table
  • 列(column
  • 字符串字面常量(string literal

MySQL支持的字符集

字符集与排序规则

执行下面的命令查看MySQL支持的字符集:

--方法1
> SELECT * FROM INFORMATION_SCHEMA.CHARACTER_SETS;
--方法2
> SHOW CHARCATER SET;
> SHOW CHARACTER SET LIKE 'latin%';
+---------+-----------------------------+-------------------+--------+
| Charset | Description                 | Default collation | Maxlen |
+---------+-----------------------------+-------------------+--------+
| latin1  | cp1252 West European        | latin1_swedish_ci |      1 |
| latin2  | ISO 8859-2 Central European | latin2_general_ci |      1 |
| latin5  | ISO 8859-9 Turkish          | latin5_turkish_ci |      1 |
| latin7  | ISO 8859-13 Baltic          | latin7_general_ci |      1 |
+---------+-----------------------------+-------------------+--------+

每个字符集支持至少一种排序规则。执行下面的命令来查看某个字符集支持的排序规则:

--方法1
> SELECT COLLATION_NAME FROM INFORMATION_SCHEMA.COLLATIONSWHERE CHARACTER_SET_NAME LIKE 'utf8';
--方法2
> SHOW COLLATION WHERE Charset = 'latin1';
+-------------------+---------+----+---------+----------+---------+
| Collation         | Charset | Id | Default | Compiled | Sortlen |
+-------------------+---------+----+---------+----------+---------+
| latin1_german1_ci | latin1  |  5 |         | Yes      |       1 |
| latin1_swedish_ci | latin1  |  8 | Yes     | Yes      |       1 |
| latin1_danish_ci  | latin1  | 15 |         | Yes      |       1 |
| latin1_german2_ci | latin1  | 31 |         | Yes      |       2 |
| latin1_bin        | latin1  | 47 |         | Yes      |       1 |
| latin1_general_ci | latin1  | 48 |         | Yes      |       1 |
| latin1_general_cs | latin1  | 49 |         | Yes      |       1 |
| latin1_spanish_ci | latin1  | 94 |         | Yes      |       1 |
+-------------------+---------+----+---------+----------+---------+

排序规则具有以下特点:

  • 一种排序规则最多只能关联一种字符集,即两个字符集不会有相同的排序规则;
  • 每个字符集都有一种默认的排序规则;
  • 排序规则的名称以它关联的字符集名称开头,再加上一些能表名其排序特性的后缀结束。

排序规则的命名

排序规则的名称以它关联的字符集名称开头,加上一个或多个后缀结束。后缀可以指明排序规则支持的语言、以及是否大小写敏感(case sensitive/insensitive)、声调/重音敏感(accent sensitive/insensitive),等等。例如

  • utf8_general_ci:utf8字符集的通用排序规则,大小写不敏感;
  • utf8_turkish_ci:utf8字符集、土耳其语的排序规则,大小写不敏感;
  • latin1_general_cs:latin1字符集的通用排序规则,大小写敏感。

使用字符集与排序规则

服务器级别的字符集

MySQL服务器级别的默认字符集和排序规则分别是latin1latin1_swedish_ci

使用mysqld命令初始化服务器时可以指定字符集和排序规则。

#方法一
$ mysqld --character-set-server=utf8
#方法二
$ mysqld --character-set-server=utf8 --collation-server=utf8_general_ci

如果仅指定了字符集,则会采用默认的排序规则。因此上面两次执行的命令是等价的。

查看当前服务器级别的字符集信息:

> show [global|session] variables like 'character_set_server';
> show [global|session] variables like 'collation_server';

如果在使用CREATE DATABASE命令创建数据库时,没有指定字符集和排序规则,则会默认使用服务器级别的字符集和排序规则。

数据库级别的字符集

在创建数据库时指定字符集和排序规则:

> CREATE DATABASE db_name[[DEFAULT] CHARACTER SET charset_name][[DEFAULT] COLLATE collation_name];

修改数据库的字符集和排序规则:

> ALTER DATABASE db_name[[DEFAULT] CHARACTER SET charset_name][[DEFAULT] COLLATE collation_name];

在上面的命令中,中括号表示非必选项。

  • 如果仅指定了字符集,则会使用默认的排序规则;
  • 如果仅指定了排序规则,则会使用其关联的字符集;
  • 如果字符集和排序规则都未指定,则会使用服务器级别的字符集和排序规则。

查看指定数据库的字符集和排序规则:

USE db_name;
SELECT @@character_set_database, @@collation_database;

或者

SELECT DEFAULT_CHARACTER_SET_NAME, DEFAULT_COLLATION_NAMEFROM INFORMATION_SCHEMA.SCHEMATA WHERE SCHEMA_NAME = 'db_name';

数据库级别的字符集和排序规则具有以下影响:

  • 在使用CREATE TABLE命令创建表时,如果没有指定字符集和排序规则,则会默认使用数据库级别的字符集和排序规则;
  • 在使用LOAD DATA导入数据时,如果没有指定字符集,则会默认使用数据库级别的字符集;
  • 在创建存储过程或者函数时,declare的参数如果没有指定字符集和排序规则,则会默认使用创建该存储过程/函数时、数据库级别的字符集和排序规则。

表级别的字符集

在创建表时指定字符集和排序规则:

> CREATE TABLE tbl_name (column_list)[[DEFAULT] CHARACTER SET charset_name][COLLATE collation_name]];

修改表的字符集和排序规则:

> ALTER TABLE tbl_name[[DEFAULT] CHARACTER SET charset_name][COLLATE collation_name];

在上面的命令中

  • 如果仅指定了字符集,则会使用默认的排序规则;
  • 如果仅指定了排序规则,则会使用其关联的字符集;
  • 如果字符集和排序规则都未指定,则会使用数据库级别的字符集和排序规则。

如果表中的列没有定义字符集和排序规则,则会使用表级别的字符集和排序规则作为默认值。

列级别的字符集

字符类型的列,比如charvarchartext等,也可以定义自己的字符集和排序规则。

在创建表时指定列的字符集:

> CREATE TABLE t1
(col1 VARCHAR(5)CHARACTER SET latin1COLLATE latin1_german1_ci
);

修改列的字符集:

> ALTER TABLE t1 MODIFYcol1 VARCHAR(5)CHARACTER SET latin1COLLATE latin1_swedish_ci;

:如果修改前后的字符集不兼容,可能会丢失数据。

在上面的命令中

  • 如果仅指定了字符集,则会使用默认的排序规则;
  • 如果仅指定了排序规则,则会使用其关联的字符集;
  • 如果字符集和排序规则都未指定,则会使用表级别的字符集和排序规则。

字符串级别的字符集

SQL语句SELECT 'string'中,字符串string的默认字符集和排序规则分别由系统变量charcater_set_connectioncollation_connection定义。

可以使用introducer_charset_name)来指定字符串字面常量的字符集和排序规则:

SELECT 'abc';
SELECT _latin1'abc';   --指定字符集
SELECT _utf8'abc' COLLATE utf8_danish_ci;   --指定字符集和排序规则

同样地

  • 如果仅指定了字符集,则会使用默认的排序规则;
  • 如果仅指定了排序规则,则会使用其关联的字符集;
  • 如果字符集和排序规则都未指定,则会使用charcater_set_connectioncollation_connection定义的字符集和排序规则。

National字符集

标准SQL中定义了NCHAR或者NATIONAL CHAR来作为CHAR类型的列应该使用的预定义的字符集。MySQL使用utf8作为预定义的字符集。

因此,下面的语句是等价的:

SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';

References
【1】Character Sets and Collations in MySQL

MySQL字符集与排序规则相关推荐

  1. MySQL 字符集 和 排序规则

    字符集 用到字符的地方就会用到字符集,通过字符集对字符串编码转换成二进制序列,进而可以对这个二进制序列进行存储或传输,之后在读取的时候通过该字符集对二进制序列进行解码得到字符串内容,这就是字符集的用途 ...

  2. mysql字符集的排序规则_MySql字符集与排序规则详解

    前段时间往MySQL中存入emoji表情或生僻字.繁体字时,报错无法添加,研究后发现这是字符集编码的问题,今天就来分析一下各个字符集与排序规则 一.字符集 先说字符,字符是各种文字和符号的总称,包括各 ...

  3. mysql查看字符排序规则_Mysql 字符集及排序规则

    原文: Mysql 字符集及排序规则 一.字符集 字符集:就是用来定义字符在数据库中的编码的集合. 常见的字符集:utf8.Unicode.GBK.GB2312(支持中文).ASCCI(不支持中文) ...

  4. mysql字符集排序规则_MySQL原理 - 字符集与排序规则

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...

  5. 2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...

  6. MySQL原理 - 字符集与排序规则

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...

  7. mysql8.0字符集排序规则_2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?...

    任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...

  8. mysql新建数据库字符集与排序规则的选择

    目录 字符集选择 排序规则 字符集选择 一般选择utf8.下面介绍一下utf8与utfmb4的区别. utf8mb4兼容utf8,且比utf8能表示更多的字符.至于什么时候用,看你的做什么项目了,到 ...

  9. mysql 中文字符排序规则_mysql中字符集和排序规则说明

    数据库需要适应各种语言和字符就需要支持不同的字符集(Character Set),每种字符集也有各自的排序规则(Collation). 一.字符集 字符集,即用于定义字符在数据库中的编码的集合. 常见 ...

最新文章

  1. 摆地摊创业赚钱完全详细攻略
  2. VMware大会宋家瑜言虚拟化2015年方至巅峰
  3. rxjs的pipe和map配合使用的单步调试
  4. 已知网友建立html,职称计算机模拟试题:Dreamweaver网页设计模拟试题及答案(5)...
  5. phpcmsV9导航高亮:调用任意的一级栏目,如何让选中的二级子栏目实现高亮显示?
  6. 利用sendmail搭建电子邮件服务器
  7. 这款老不死的笔记本,产品小姐姐的最爱......
  8. 站内搜索(ELK)之数据目录
  9. 用户登录MySQL服务器的方法
  10. 程序员电脑屏保画面,显示时间
  11. 维基百科-D3.js
  12. Word文档另存为PDF时修改的交叉引用还原bug
  13. unbuntu基本操作
  14. linux marvell 网卡驱动,linux下安装Marvell Yukon网卡驱动
  15. 什么是ISO镜像文件,为什么不能拷贝到U盘直接重新安装?
  16. 【Arduino学习笔记】系列1 - 定时器配置
  17. SDR技术原理解析 USRP收发原理
  18. springboot美食分享系统 毕业设计-附源码612231
  19. 最大公约数(gcd)
  20. 12.中断+外部中断

热门文章

  1. MySQL授权用户数据库权限
  2. php配置出问题,php.ini配置中有3处设置可能导致网站安全出问题
  3. linux抓包命令到文件,Linux下抓包命令tcpdump详解
  4. Pwnable之[Toddler's Bottle](三)--asm
  5. 关于python安装库的方法
  6. 汇总——前端UI框架
  7. doFilter过滤器如何使用
  8. LADA:Local Additivity Based Data Augmentation for Semi-supervised NER理解
  9. DELL电脑风扇过大(win10和win11)
  10. mysql in子句_MySQL IN子句