官方文档地址:
http://dev.mysql.com/doc/refman/5.6/en/globalization.html
查看数据库状态
mysql> status;
--------------
mysql Ver 14.14 Distrib 5.6.13, for Linux (x86_64) using EditLine wrapper
Connection id: 2
Current database:
Current user: root@localhost
SSL: Not in use
Current pager: stdout
Using outfile: ''
Using delimiter: ;
Server version: 5.6.13-log Source distribution
Protocol version: 10
Connection: Localhost via UNIX socket
Server characterset: utf8
Db characterset: utf8
Client characterset: utf8
Conn. characterset: utf8
UNIX socket: /usr/local/mysql/mysql.sock
Uptime: 20 min 53 sec
Threads: 2 Questions: 6 Slow queries: 0 Opens: 70 Flush tables: 1 Open tables: 63 Queries per second avg: 0.004
--------------
查看当前数据库字符集
mysql> show variables like '%character%';
+--------------------------+----------------------------------+
| Variable_name | Value |
+--------------------------+----------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mysql/share/charsets/ |
+--------------------------+----------------------------------+
8 rows in set (0.01 sec)
字符集编码:
简单举个不太恰当的例子说明
假设有两个字符A B,然后对A编码为0,B编码为1.那么字符串”AABBB”编码后就是”00111”,就形成了字符集.
通常数据库的字符集编码包括utf8(国际)gbk(中文)latin1(拉丁1版本)
mysql有6个关键位置使用了字符集
Client 前端编码<charset =utf-8> 客户端
Connection 连接编码url ip..?charset=utf8
Database 数据库编码
Results 返回客户端的编码
Server install 安装时候指定的编码
System os操作系统编码
检测字符集的方法
SHOW CHARACTER SET; #包括哪些编码类型
SHOW COLLATION;
SHOW VARIABLES LIKE 'character%';
SHOW VARIABLES LIKE ‘collation%’;
HEX、LENGTH、CHAR_LENGTH #SQL函数
CHARSET、COLLATION #SQL函数
乱码总结
- 客户端的数据格式与声明的
character_set_client
不符 例如:<charset gbk>
character_set_results
与客户端页面不符合的时候<charset=gbk>
避免乱码问题:
客户端页面 == character_set_client == character_set_results == character_set_connection == character_set_database == character_set_server
修改字符集
set names utf8; 与如下效果相同
SET character_set_client=’utf8’;
SET character_set_connection=’utf8’;
SET character_set_results=’utf8’;My.cnf 里面:
#保证和数据库编码一致,当mysql客户端链接过来时候,不管是什么字符集,都会按server字符集存储,保证数据库字符集一致
skip-character-set-client-handshake
#链接默认字符集
init-connect='SET NAMES utf8'
#整个数据库字符集
character-set-server=utf8
字符集转换过程
数据迁移中的字符集
保证两个数据库的字符集是一样的,通过SHOW VARIABLES LIKE 'character%';
查看
数据丢失 utf8->gbk->latin1 utf8迁移到gbk会丢失,gbk迁移到latin会丢失
数据备份恢复的字符集设定
- 物理备份恢复基本ok
- 逻辑备份
Gbk表+utf8表混合在一起,使用binary(二进制)备份恢复
字符集变更了,使用逻辑备份恢复方式,否则直接ddl可能导致数据丢失。
跨版本升级的-逻辑备份恢复数据
数据恢复的时候加mysqldump参数default_charectar_set=utf8/gbk
逻辑备份的时候一定要保持一致,