第 4 章 · 第三节
MySQL 字符集的设置级别
字符集能在四个层次上设,从服务器一路管到列。

试一试哪一级写了就听谁的
怎么设
服务器
数据库
数据表
哪一级写了就听哪一级的,没写就照抄上一级。
记牢它四级
- 服务器 Server
- 数据库 Database
- 数据表 Table
- 连接 Connection
重 点
前三级层层继承,下面不写就照抄上面。连接级由客户端自己说了算。
字符集能在四个层次上设,从服务器一路管到列。

前三级层层继承,下面不写就照抄上面。连接级由客户端自己说了算。
分级是为了让不同范围的数据各用各的编码。

学校定校服,学院可以自己改,班级还能再改,谁都不写就穿学校那套。
客户端、连接、结果三处常是 gbk,服务器是 utf8mb4,乱码就从这里来。
存进去是好的,读出来是乱的,问题出在哪一级?
校对规则也分四级,查法和字符集一模一样。

| 查什么 | 命令怎么写 |
|---|---|
| 各级字符集 | 变量名以 character 开头 |
| 各级校对规则 | 换成 collation 开头 |
把 character 换成 collation,其余写法一个字不变。
连接级用 gbk,服务器用 utf8mb4,会出事吗?
乱码分两种:存进去就坏了,和读出来才坏。

| 现象 | 说明什么 |
|---|---|
| 录入正常,存完是乱码 | 写的时候编码就错了 |
| 存的是好数据,读出来乱 | 读的时候编码对不上 |
前一种是抄错了字,后一种是字没抄错、你拿错了字典。
你遇到过打开文件满屏方块的情况吗?
顺着数据流走一遍,乱码只可能出在三处。

| 环节 | 这一步是什么 |
|---|---|
| 程序发出去 | 你好 |
| 路上的字节 | E4 BD A0 E5 A5 BD |
| 读回来看到 | 你好 |
字存不下才会变问号,多半是库还在用 latin1 或者 utf8。
建库时把字符集写清楚,能挡掉绝大多数乱码。