mysql字符集浅谈

官方文档地址:
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 LIKEcollation%’; 
HEX、LENGTH、CHAR_LENGTH #SQL函数
CHARSET、COLLATION #SQL函数

乱码总结

  1. 客户端的数据格式与声明的 character_set_client不符 例如: <charset gbk>
  2. character_set_results与客户端页面不符合的时候 <charset=gbk>
    避免乱码问题:
客户端页面  ==  character_set_client  ==  character_set_results  == character_set_connection == character_set_database == character_set_server

修改字符集

  1. set names utf8; 与如下效果相同
    SET character_set_client=’utf8’;
    SET character_set_connection=’utf8’;
    SET character_set_results=’utf8’;

  2. 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会丢失

数据备份恢复的字符集设定

  1. 物理备份恢复基本ok
  2. 逻辑备份
    Gbk表+utf8表混合在一起,使用binary(二进制)备份恢复
    字符集变更了,使用逻辑备份恢复方式,否则直接ddl可能导致数据丢失。
    跨版本升级的-逻辑备份恢复数据
    数据恢复的时候加mysqldump参数default_charectar_set=utf8/gbk逻辑备份的时候一定要保持一致,
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值