关于MySql字符集编码问题

  • 关于数据库字符集编码
  • mysql使用字符集的优先级
  • 新建数据库时的collation选择参考
  • 各个层级字符集说明
  • 查看和修改数据库字符集


关于数据库字符集编码

假如客户端使用的是utf-8字符集,而数据库使用的是gbk字符集。现在客户端生成的所有sql操作语句都是utf-8的,导致数据库认为插入和修改的语句是gbk编码而乱码或失败,也导致查询时数据库返回gbk字符集编码客户端展示乱码。

所以需要针对客户端或数据库设置字符集编码,通常有3种方式

1、修改数据库字符集与客户端一致

2、修改客户端字符集与数据库一致

3、设置客户端与数据库连接session在session中指定客户端字符集让数据库转码

mysql、oracle、sqlserver等数据库普遍都会设置sql语句输入字符集和结果输出字符集,不同的是mysql比其他数据库多了一个校对字符集编码collation(后面解释什么是校对字符集编码)。

mysql使用字符集的优先级

mysql与其他数据库不同的是可以单独为表中的每一列指定字符集编码。字符集校对collation主要是限定列的条件筛选查询与列的排序,对列设定的字符集会影响到查询条件大小写是否敏感以及排序的先后顺序。

selct * from users where name like binary '%小鱼%';

一条sql语句在数据库执行最终使用的字符集编码会按照优先级的方式选定

  1. 如果sql语句中包含了针对某列字段的字符集限定就会首选sql语句中指定字符集如以上语句针对“name 告诉数据库客户端是使用的是 binary 字符集与排序”;
  2. 如果未在sql语句中没有限定字符集就使用创建表时指定的列字符集与排序;
  3. 如果列未指定字符集就使用表的字符集与排序;
  4. 如果表未指定字符集就使用数据库的字符集与排序;
  5. 如果数据库未指定字符集就使用连接session中指定的字符集与排序;
  6. 如果连接session中未指定字符集就使用服务器的字符集