MySQL character set、collation(整理)

1 查看当前设置

Character: 字符集
Collation:在同一字符集内字符之间的比较规则、排序

collation查看:
SHOW VARIABLES LIKE 'collation_%';
+----------------------+--------------------+
| Variable_name        | Value              |
+----------------------+--------------------+
| collation_connection | utf8_general_ci    |
| collation_database   | utf8mb4_general_ci |
| collation_server     | utf8mb4_general_ci |
+----------------------+--------------------+

character set查看:
SHOW VARIABLES LIKE 'character_set_%';
+--------------------------+----------------------------------+
| Variable_name            | Value                            |
+--------------------------+----------------------------------+
| character_set_client     | utf8                             |
| character_set_connection | utf8                             |
| character_set_database   | utf8mb4                          |
| character_set_filesystem | binary                           |
| character_set_results    | utf8                             |
| character_set_server     | utf8mb4                          |
| character_set_system     | utf8                             |
| character_sets_dir       | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
2 设置

mysql 命令:

SET  Variable_name  = Value

1 服务器级

(/etc/mysql/my.cnf)里设置: 
[mysqld] 
    character_set_server=utf8 
    collation_server=utf8_general_ci 

2 数据库级

  • 若没有显式设置,则自动使用服务器级的配置
  • 显式设置,在创建库时指定

3 表级
查看show create table �table_name;

  • 没有显式设置,则自动使用数据库级的配置
  • 显式设置,在创建表时指定
CREATE TABLE `b` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `sid` int(11) unsigned NOT NULL DEFAULT '0',
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

4 列级

  • 若没有显式设置,则自动使用表级的配置
  • 显式设置:在创建时指定

5 连接级别

# 服务端使用这个编码来理解客户端发来的
character_set_client;

# 连接层字符集 character_set_client 转 character_set_connection
show variables like 'character_set_connection' ; 

# 服务端使用这个编码回送结果集和错误信息
show variables like 'character_set_results'; 
3 常见问题
  • 向默认字符集为utf8的数据表插入utf8编码的数据前没有设置连接字符集,查询时设置连接字符集为utf8
  • 插入时根据MySQL服务器的默认设置,character_set_client、character_set_connection和character_set_results均为latin1
  • 插入操作的数据将经过latin1=>latin1=>utf8的字符集转换过程,这一过程中每个插入的汉字都会从原始的3个字节变成6个字节保存
  • 向默认字符集为latin1的数据表插入utf8编码的数据前设置了连接字符集为utf8
  • 插入时根据连接字符集设置,character_set_client、character_set_connection和character_set_results均为utf8
  • 插入数据将经过utf8=>utf8=>latin1的字符集转换,若原始数据中含有\u0000~\u00ff范围以外的Unicode字符,会因为无法在latin1字符集中表示而被转换为“?”(0×3F)符号,以后查询时不管连接字符集设置如何都无法恢复其内容了。转换过程如下图:
4 建议
  • 建立数据库/表和进行数据库操作时尽量显式指出使用的字符集,而不是依赖于MySQL的默认设置,否则MySQL升级时可能带来很大困扰;
  • 一般情况下将数据库和连接字符集都置为utf8、utf8mb4是较好的选择;
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
【社区内容提示】社区部分内容疑似由AI辅助生成,浏览时请结合常识与多方信息审慎甄别。
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

相关阅读更多精彩内容

  • From: 博客园 Johney最近,在项目组使用的mysql数据库中,插入数据出现乱码,关于这个问题做了下总结...
    zheng7阅读 1,014评论 1 2
  • 转自: http://www.laruence.com/2008/01/05/12.html 略有修改 基本概念 ...
    布丁芝麻糊糊阅读 1,100评论 1 1
  • 前段时间公司内部博客上凯哥分享了一篇关于mysql字符集编码的文章,之前我对mysql字符集一块基本没有深究过,看...
    __七把刀__阅读 6,678评论 14 18
  • MySQL数据库对象与应用 2.1-MySQL数据类型 库建立好之后基本不动,和我们接触最频繁的是表. 建表就是声...
    极客圈阅读 2,241评论 0 8
  • 1 请了半天假参加面试,骑驴找马的心态在请假的当下显得鬼祟和苟且。 可以找好多冠冕堂皇的理由搪塞请假的缘由,一一记...
    素一航阅读 358评论 0 4

友情链接更多精彩内容