MySQL 字符集

Posted 河乐不为

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了MySQL 字符集相关的知识,希望对你有一定的参考价值。

引言

刚刚入门数据库开发的开发者估计没少被字符串“乱码”的问题所困扰,导致乱码的原因有很多,而最常见的原因可能是对字符集和排序规则没有概念,因此在创建数据库时便已早早埋下了地雷。

 

字符集和排序规则

同理,假如使用 Navicat for mysql 这样的可视化管理工具来管理数据库,在创建数据库时会弹出如下弹窗,要求我们输入三项基础信息:数据库名、字符集和排序规则,其中字符集和排序规则是比较重要的概念,正确的设置有助于避免工作中遇到的“乱码”问题。

  • 字符集(character set):用来定义存储字符串的方式

    MySQL 提供字符集支持,使得我们可以使用各种字符集存储数据,并根据各种排序规则进行比较。字符集分为几个等级: server, database, table, 和 column 。

  • 排序规则(collations):用来定义比较字符串的方式

    也叫字符序或校对规则

字符集和排序规则需符合以下几点:

  • 一个字符集有一种或多种排序规则;

  • 两个不同的字符集不能有相同的排序规则;

  • 每个字符集都有默认的排序规则。

排序规则通常都有一定的命名规则:字符集名_[语言名_]类型 (语言名并非一定有的,后缀为 _bin 的就没有),并且可通过后缀来区分类型:

  • _ci :大小写不敏感

  • _cs :大小写敏感

  • _bin :标识比较是基于字符编码的值,而与语言无关

 

指定字符集和排序规则

我们都知道在命令行中创建一个新的数据库时,可以通过如下指令:

mysql> CREATE DATABASE 数据库名;

此时会使用默认的字符集及其默认排序规则来创建数据库,而这个默认值可以在 MySQL 安装根目录下的 my.ini (或者 my-defualt.ini )中进行配置,例如都设为 utf8

[mysqld]
# 服务端使用的字符集默认为UTF8
character-set-server=utf8
[mysql]
# 设置mysql客户端默认字符集
default-character-set=utf8
[client]
default-character-set=utf8

假如要在创建时指定字符集和排序规则,则应如下:

mysql> CREATE DATABASE 数据库名 CHARACTER SET '字符集,如:utf8' COLLATE '排序规则,如:utf8_bin';

假如不指定 COLLATE 则会使用指定字符集的默认排序规则来创建。

由于字符集分为多种层级,因此在创建数据库不同层级结构时都可以通过类似的方法来指定该层级使用的字符集和排序规则。

 

查询字符集和排序规则

对于已创建的数据库结构,可以通过指令来查询其使用的字符集信息,例如查询各级的字符集:

mysql> SHOW VARIABLES LIKE '%char%';
+--------------------------+-------------------------------------------------------------+
| Variable_name            | Value                                                       |
+--------------------------+-------------------------------------------------------------+
| character_set_client     | gbk                                                         |
| character_set_connection | gbk                                                         |
| character_set_database   | utf8mb4                                                     |
| character_set_filesystem | binary                                                      |
| character_set_results    | gbk                                                         |
| character_set_server     | utf8mb4                                                     |
| character_set_system     | utf8                                                        |
| character_sets_dir       | E:\\ServiceCode\\DB\\MySQL\\mysql-8.0.15-winx64\\share\\charsets\\ |
+--------------------------+-------------------------------------------------------------+
8 rows in set, 1 warning (0.01 sec)

查询对应的排序规则也是类似:

mysql> SHOW VARIABLES LIKE '%collation_%';
+-------------------------------+--------------------+
| Variable_name                 | Value              |
+-------------------------------+--------------------+
| collation_connection          | gbk_chinese_ci     |
| collation_database            | utf8mb4_0900_ai_ci |
| collation_server              | utf8mb4_0900_ai_ci |
| default_collation_for_utf8mb4 | utf8mb4_0900_ai_ci |
+-------------------------------+--------------------+
4 rows in set, 1 warning (0.01 sec)

 

修改字符集和排序规则

这里需要区分情况:

  • 未创建的数据库

    可以通过在创建命令中指定字符集的方式实现修改,也可以通过修改MySQL 安装根目录下的 my.ini (或者 my-defualt.ini )中的配置实现修改。

  • 已创建数据库无数据

    可以使用如下指令进行修改:

    > ALTER DATABASE 数据库名 CHARACTER SET '字符集,如:utf8' COLLATE '排序规则,如:utf8_bin';
  • 已创建且有数据的数据库

    直接修改的话只会对新创建的表或者记录有效,已存入的数据不会被修改。假如需要修改所有数据,需要将原表导出,创建新表再将旧表数据迁移过来。

 

参考


微信公众号「何乐不为呢」,一个码农的技术笔记和唠叨。

以上是关于MySQL 字符集的主要内容,如果未能解决你的问题,请参考以下文章

MySQL 字符集

原生 JavaScript 实现扫雷 (分析+代码实现)

贪婪大陆

贪婪大陆

如何在MySql中使用查询来分解字符串多种颜色并对其进行分组

贪婪大陆 树状数组