mysql字符集相关总结

这边笔记主要记录一下对mysql字符集相关知识的学习

字符集

一般我们使用如下语句创建一张表,创建表的时候指定了charset为utf8编码。

CREATE TABLE `test` (
 `c1` int UNSIGNED NOT NULL AUTO_INCREMENT,
 `c2` varchar(255),
 `c3` char(11),
 `c4` varchar(255),
 PRIMARY KEY (`c1`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

但其实mysql也支持除了utf8之外的其他字符集,可以使用命令 show charset 查看当前mysql支持的所有字符集。

例如下图就是我的mysql支持的所有字符集。

可以从上图中看到,第四列表示该字符集最大长度。我们建表时常用的 utf8 在mysql里面实际最大长度是 3 个字符。一般认知中utf8是用1~4个字符来表示具体的内容的,但mysql里面的 utf8 实际是 utf8mb3 的别名,正宗的的最大用4个字符表示的在mysql中是 utf8mb4 。

注意:

utf8mb4
utf8mb4

比较规则

在上面那张图中,第三列 Default collation 就是这些字符集默认的比较规则。例如acsii字符集的默认比较规则是 ascii_general_ci ,utf8字符集的默认比较规则是 utf8_general_ci 。

其实每个字符集有很多种比较规则,例如我们看一下acsii字符集有哪些比较规则,如下图所示

mysql> show collation like 'ascii%';
+------------------+---------+----+---------+----------+---------+
| Collation  | Charset | Id | Default | Compiled | Sortlen |
+------------------+---------+----+---------+----------+---------+
| ascii_general_ci | ascii | 11 | Yes  |   |  0 |
| ascii_bin  | ascii | 65 |   |   |  0 |
+------------------+---------+----+---------+----------+---------+

ascii_general_ci 表示是一种通用的比较,其中 _ci 表示是不区分大小写(case insensitive)。(反之 _cs 就表示大小写敏感)

ascii_bin 表示是二进制比较

再看一下utf8、utf8mb4字符集有哪些比较规则,如下图所示

mysql> show collation like 'utf8%';
+--------------------------+---------+-----+---------+----------+---------+
| Collation    | Charset | Id | Default | Compiled | Sortlen |
+--------------------------+---------+-----+---------+----------+---------+
| utf8_general_ci   | utf8 | 33 | Yes  | Yes  |  1 |
| utf8_bin     | utf8 | 83 |   | Yes  |  1 |
| utf8_unicode_ci   | utf8 | 192 |   | Yes  |  8 |
| utf8_icelandic_ci  | utf8 | 193 |   | Yes  |  8 |
| utf8_latvian_ci   | utf8 | 194 |   | Yes  |  8 |
| utf8_romanian_ci   | utf8 | 195 |   | Yes  |  8 |
| utf8_slovenian_ci  | utf8 | 196 |   | Yes  |  8 |
| utf8_polish_ci   | utf8 | 197 |   | Yes  |  8 |
| utf8_estonian_ci   | utf8 | 198 |   | Yes  |  8 |
| utf8_spanish_ci   | utf8 | 199 |   | Yes  |  8 |
| utf8_swedish_ci   | utf8 | 200 |   | Yes  |  8 |
| utf8_turkish_ci   | utf8 | 201 |   | Yes  |  8 |
| utf8_czech_ci   | utf8 | 202 |   | Yes  |  8 |
| utf8_danish_ci   | utf8 | 203 |   | Yes  |  8 |
| utf8_lithuanian_ci  | utf8 | 204 |   | Yes  |  8 |
| utf8_slovak_ci   | utf8 | 205 |   | Yes  |  8 |
| utf8_spanish2_ci   | utf8 | 206 |   | Yes  |  8 |
| utf8_roman_ci   | utf8 | 207 |   | Yes  |  8 |
| utf8_persian_ci   | utf8 | 208 |   | Yes  |  8 |
| utf8_esperanto_ci  | utf8 | 209 |   | Yes  |  8 |
| utf8_hungarian_ci  | utf8 | 210 |   | Yes  |  8 |
| utf8_sinhala_ci   | utf8 | 211 |   | Yes  |  8 |
| utf8_german2_ci   | utf8 | 212 |   | Yes  |  8 |
| utf8_croatian_ci   | utf8 | 213 |   | Yes  |  8 |
| utf8_unicode_520_ci  | utf8 | 214 |   | Yes  |  8 |
| utf8_vietnamese_ci  | utf8 | 215 |   | Yes  |  8 |
| utf8_general_mysql500_ci | utf8 | 223 |   | Yes  |  1 |
| utf8mb4_general_ci  | utf8mb4 | 45 | Yes  | Yes  |  1 |
| utf8mb4_bin    | utf8mb4 | 46 |   | Yes  |  1 |
| utf8mb4_unicode_ci  | utf8mb4 | 224 |   | Yes  |  8 |
| utf8mb4_icelandic_ci  | utf8mb4 | 225 |   | Yes  |  8 |
| utf8mb4_latvian_ci  | utf8mb4 | 226 |   | Yes  |  8 |
| utf8mb4_romanian_ci  | utf8mb4 | 227 |   | Yes  |  8 |
| utf8mb4_slovenian_ci  | utf8mb4 | 228 |   | Yes  |  8 |
| utf8mb4_polish_ci  | utf8mb4 | 229 |   | Yes  |  8 |
| utf8mb4_estonian_ci  | utf8mb4 | 230 |   | Yes  |  8 |
| utf8mb4_spanish_ci  | utf8mb4 | 231 |   | Yes  |  8 |
| utf8mb4_swedish_ci  | utf8mb4 | 232 |   | Yes  |  8 |
| utf8mb4_turkish_ci  | utf8mb4 | 233 |   | Yes  |  8 |
| utf8mb4_czech_ci   | utf8mb4 | 234 |   | Yes  |  8 |
| utf8mb4_danish_ci  | utf8mb4 | 235 |   | Yes  |  8 |
| utf8mb4_lithuanian_ci | utf8mb4 | 236 |   | Yes  |  8 |
| utf8mb4_slovak_ci  | utf8mb4 | 237 |   | Yes  |  8 |
| utf8mb4_spanish2_ci  | utf8mb4 | 238 |   | Yes  |  8 |
| utf8mb4_roman_ci   | utf8mb4 | 239 |   | Yes  |  8 |
| utf8mb4_persian_ci  | utf8mb4 | 240 |   | Yes  |  8 |
| utf8mb4_esperanto_ci  | utf8mb4 | 241 |   | Yes  |  8 |
| utf8mb4_hungarian_ci  | utf8mb4 | 242 |   | Yes  |  8 |
| utf8mb4_sinhala_ci  | utf8mb4 | 243 |   | Yes  |  8 |
| utf8mb4_german2_ci  | utf8mb4 | 244 |   | Yes  |  8 |
| utf8mb4_croatian_ci  | utf8mb4 | 245 |   | Yes  |  8 |
| utf8mb4_unicode_520_ci | utf8mb4 | 246 |   | Yes  |  8 |
| utf8mb4_vietnamese_ci | utf8mb4 | 247 |   | Yes  |  8 |
+--------------------------+---------+-----+---------+----------+---------+

使用不同的比较规则对数据进行比较,结果可能是不一样的。

字符集和比较规则是对应的,不管是只修改字符集还是只修改比较规则,另一方都会相应地自动变化。

四个级别的字符集和比较规则

上文提到了字符集和比较规则,实际上在mysql里面有不同级别的字符集和比较规则:

  • 服务器级别
  • 数据库级别
  • 表级别
  • 列级别

服务器级别的字符集可以看参数 character_set_server ,服务器级别的比较规则可以看参数 collation_server

mysql> show variables like 'character_set_server';
+----------------------+-------+
| Variable_name  | Value |
+----------------------+-------+
| character_set_server | utf8 |
+----------------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'collation_server';
+------------------+-----------------+
| Variable_name | Value   |
+------------------+-----------------+
| collation_server | utf8_general_ci |
+------------------+-----------------+
1 row in set (0.00 sec)

如果要查看数据库级别的字符集和比较规则,那么可以先 use xxxdb 切换到具体的数据库,然后执行 show variables like 'character_set_database' 和 show variables like 'collation_database' 来查看该数据库的字符集和比较规则。

Database changed
mysql> show variables like 'character_set_database';
+------------------------+-------+
| Variable_name   | Value |
+------------------------+-------+
| character_set_database | utf8 |
+------------------------+-------+
1 row in set (0.00 sec)

mysql> show variables like 'collation_database';
+--------------------+-----------------+
| Variable_name  | Value   |
+--------------------+-----------------+
| collation_database | utf8_general_ci |
+--------------------+-----------------+
1 row in set (0.00 sec)

如果要查看某个表的字符集和比较规则,或者表中的某个列的字符集和比较规则,那么可以使用 show create table xxxtb 来查看具体的建表语句,里面就有使用的字符集和比较规则。

如果创建数据库的时候没有指定字符集和比较规则,则会使用服务器级别的字符集和比较规则作为数据库的字符集和比较规则。如果创建和修改表的语句中没有指明字符集和比较规则,将使用该表所在数据库的字符集和比较规则作为该表的字符集和比较规则

三个系统变量

mysql服务器可以对应多个客户端,而这些客户端的编码方式可能不同,但存在数据库里的数据的字符集是一定的,mysql就要针对不同的客户端进行编码转换处理,然后返回结果给客户端。

在mysql里面,有三个 SESSION级别 的系统变量,可以进行上述操作:

  • character_set_client : 服务器解码客户端请求时使用的字符集
  • character_set_connection : 服务器处理请求时会把请求字符串从character_set_client转为character_set_connection
  • character_set_results : 服务器向客户端返回数据时使用的字符集

mysql服务器会为每个客户端都维护一份session级别的这三个变量。

不过在实际生产环境中,为了避免麻烦,公司一般都会有规范规定客户端默认都使用utf8字符集。

以上就是mysql字符集相关总结的详细内容,更多关于mysql字符集的资料请关注我们其它相关文章!

(0)

相关推荐

  • 如何修改MySQL字符集

    一.查看MySQL的字符集 show variables like '%char%'; 二.修改MySQL配置文件 不是安装目录,是数据目录. 我是用sublime打开的. 进去之后,在三个地方增加配置. 第一个: [client] default-character-set=utf8 第二个: [mysql] default-character-set=utf8 第三个: [mysqld] character-set-client-handshake = FALSE character-set

  • mysql数据库中字符集乱码问题原因及解决

    前言 有的时候我们在查看数据库数据时,会看到乱码.实际上,无论何种数据库只要出现乱码问题,这大多是由于数据库字符集设定的问题. 下面我们就介绍一下,数据库的字符集的设定及乱码问题的解决. mysql数据库的字符集 直白的说,字符就像是单个的文字,编码就像是给每个文字的编号,字符集就像是字符与编码的集合,校验规则就是字符集的对应的排序规则,字符集加上对应的校验规则就是语言.(每种字符集可以有多种校对规则,但都有一个默认的校对规则) mysql数据库可以通过设定字符集,来使用对应的字符集和检验规则来

  • MYSQL字符集设置的方法详解(终端的字符集)

    前言 每次利用终端 创建数据库或者创建表的时候,字符集都是latin1,或者进行插入值的时候,显示的是乱码(不指定字符集的时候)如下: 查看当前数据库的字符集 character_set_client:客户端请求数据的字符集 character_set_connection:客户机/服务器连接的字符集 character_set_database:默认数据库的字符集,无论默认数据库如何改变,都是这个字符集:如果没有默认数据库,那就使用 character_set_server指定的字符集,这个变

  • 详解JDBC对Mysql utf8mb4字符集的处理

    写在前面 在开发微信小程序的时候,评论服务模块希望添加上emoji表情,但是emoji表情是4个字节长度的,所以需要进行设置 当前项目是JAVA编写, 使用JDBC连接操作数据库, 如下针对的JDBC操作的解决方案 一.JDBC的URL的正常操作 复制代码 代码如下: jdbc.url=jdbc:mysql://HOST:3306/your_database?useUnicode=true&characterEncoding=utf8&useSSL=false 在连接配置中,声明UTF-8

  • MySQL字符集utf8修改为utf8mb4的方法步骤

    对于mysql 5.5 而言,如果不设定字符集,mysql默认的字符集是 latin1 拉丁文字符集: 但随着各种业务的进一步发展,除了各个国家的本身语言字符,经常也会有一些表情符号出现在应用程序中,而在mysql 5.5 之前,UTF-8编码只支持1-3个字节,支持BMP这部分的Unicode编码区:从MySQL 5.5开始,可以支持4个字节UTF编码 utf8mb4 ,一个字符能够支持更多的字符集,也能够支持更多表情符号. utf8mb4兼容utf8,且比utf8能表示更多的字符,是utf8

  • MAC下修改mysql默认字符集为utf8的方法

    1,检查默认安装的mysql的字符集 mysql> show variables like '%char%'; +--------------------------+--------------------------------------------------------+ | Variable_name            | Value                                                  | +---------------------

  • MySQL查看与修改字符集的方法实例教程

    一.查看字符集 1.查看MYSQL数据库服务器和数据库字符集 方法一:show variables like '%character%'; 方法二:show variables like 'collation%'; mysql> show variables like '%character%'; +--------------------------+--------------------------------------+ | Variable_name | Value | +-----

  • MySQL修改字符集的实战教程

    前言: 在 MySQL 中,系统支持诸多字符集,不同字符集之间也略有区别.目前最常用的字符集应该是 utf8 和 utf8mb4 了,相比于 utf8 ,utf8mb4 支持存储 emoji 表情,使用范围更广.本篇文章将会介绍 utf8 修改成 utf8mb4 字符集的方法. 1. utf8 和 utf8mb4 字符集介绍 字符(Character)是各种文字和符号的总称,包括各国家文字.标点符号.图形符号.数字等.字符集(Character set)是多个字符的集合. MySQL 中字符集可

  • MySQL字符集乱码及解决方案分享

    前言 字符集是一套符号和编码的规则,不论是在oracle数据库还是在mysql数据库,都存在字符集的选择问题,而且如果在数据库创建阶段没有正确选择字符集,那么可能在后期需要更换字符集,而字符集的更换是代价比较高的操作,也存在一定的风险,所以,我们推荐在应用开始阶段,就按照需求正确的选择合适的字符集,避免后期不必要的调整. 实战 1.安装MySQL数据库 2.乱码演示 mysql> show variables like 'character_set%'; +-------------------

  • mysql如何在已有数据库上统一字符集

    前言 数据库里面,部分数据表和数据是latin1的,部分数据表和数据是UTF8,还有部分表,表结构是utf8而数据是latin1. 这种奇葩情况,工作了十几年的我,还是第一次碰到.下面说一下,怎么样字符集统一成utf8 1,建一个空数据库 2,把表结构和数据是utf8的表导出,然后直接导入到新的数据库中 3,数据表和数据都是latin1的表,先导出表结构和数据,加上--default-character-set=latin1,将导出文件中,latin1改为utf8,在导入到新的数据库中. 4,表

  • 详解mysql中的字符集和校验规则

    1几种常见字符集 在MySQL中,最常见的字符集有ASCII字符集.latin字符集.GB2312字符集.GBK字符集.UTF8字符集等,下面我们简单介绍下这些字符集: ASCII字符集 这个字符集使用1个字节进行编码,一个字节具有8位,总共可以保存128个字符,具体的对应关系如下: latin字符集 latin字符集一共可以保存256个字符,相比ASCII码,它又包含了128个西欧常用字符. GB2312字符集 它包含了中文汉字.拉丁字符.希腊字符等,其中汉字占了大多数,有6763个,其他文字

随机推荐