您的位置:首页 > 数据库 > MySQL

mysql字符集浅谈

2015-07-08 16:24 531 查看
官方文档地址:

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
逻辑备份的时候一定要保持一致,
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: