MySQL 乱码?看这就对了

引言

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

字符集和排序规则

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

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

排序规则():用来定义比较字符串的方式也叫字符序或校对规则

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

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

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

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

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

:大小写不敏感

:大小写敏感

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

指定字符集和排序规则

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

mysql>CREATEDATABASE数据库名;

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

[mysqld]

# 服务端使用的字符集默认为UTF8

character-set-server=utf8

[mysql]

# 设置mysql客户端默认字符集

default-character-set=utf8

[client]

default-character-set=utf8

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

mysql>CREATEDATABASE数据库名CHARACTERSET'字符集,如:utf8'COLLATE'排序规则,如:utf8_bin';

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

查询字符集和排序规则

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

mysql>SHOWVARIABLESLIKE'%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\ |

+--------------------------+-------------------------------------------------------------+

8rowsinset,1warning (0.01sec)

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

mysql>SHOWVARIABLESLIKE'%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 |

+-------------------------------+--------------------+

4rowsinset,1warning (0.01sec)

修改字符集和排序规则

这里需要区分情况:

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

已创建数据库无数据可以使用如下指令进行修改:

>ALTERDATABASE数据库名CHARACTERSET'字符集,如:utf8'COLLATE'排序规则,如:utf8_bin';

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

参考

Chapter 10 Character Sets, Collations, Unicode

再见乱码:5分钟读懂MySQL字符集设置

查看三种MySQL字符集的方法

mysql-8.0 一些简单的配置

MySQL 字符集

  • 发表于:
  • 原文链接https://kuaibao.qq.com/s/20190215G0SJUP00?refer=cp_1026
  • 腾讯「云+社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。

扫码关注云+社区

领取腾讯云代金券