mysql5.6深入解决编码乱码问题

来源:互联网 发布:热血江湖人工智能披风 编辑:程序博客网 时间:2024/06/05 03:44

mysql几乎所有乱码都是因为中文的问题
举例:

创表:mysql> create database chao;Query OK, 1 row affected (0.00 sec)mysql> use chao;Database changedmysql>  create table user(name varchar(11));Query OK, 0 rows affected (0.30 sec)mysql> show create table user;+-------+------------------------------------------------------------------------------------------------+| Table | Create Table                                                                                   |+-------+------------------------------------------------------------------------------------------------+| user  | CREATE TABLE `user` (  `name` varchar(11) DEFAULT NULL) ENGINE=InnoDB DEFAULT CHARSET=latin1 |+-------+------------------------------------------------------------------------------------------------+1 row in set (0.00 sec)插入数据验证mysql> insert into user values ("lili"); mysql> insert into user values ("大米");mysql> select * from user;+------+| name |+------+| lili || ??   |+------+让插入的下一行不乱码可以将表的字符集改为latin1查看sql文件:set names latin1;mysql> system  cat /root/test.sqlinsert into user values ("大的米");source /root/test.sql或者指定字符集:mysql -uroot -pqb123 -S /data/3306/mysql.sock --default-character-set=latin1 chao <test.sqlmysql> select * from user;+-----------+| name      |+-----------+| lili      || ??        || 大的米    || 大大米    |

上述方法不适用于生产,因为退出再进,可能还会有编码问题

不乱码思想:linux、客户端、服务端、库、表、程序、编码统一
中英文环境:适合utf-8
linux:
系统编码保持utf-8比较合适:
[root@localhost 3306]# cat /etc/sysconfig/i18n
LANG=”zh_CN.UTF-8”
客户端:
set names latinl (临时更改字符集编码)
或者:
default-character-set=utf8

服务端:(更改这个最为重要,需要起重启mysql)
[mysqld]
character_set_server=utf8mb4

库,表 一般随Mysql本身字符集跟着改变
程序:由开发指定

编码选择:
如果需发布到多国,并且汉字不多:选择UTF-8比较好
只需支持中文:选择GBK ,这样性能更快,更高
处理移动互联网业务:选择uft8mb4 比较好,能对处理特殊字符比较好

查看Mysql当前字符集编码: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       | /data/mysql-5.6.36/share/charsets/ 

默认情况下:character_set_client、character_set_connection、character_set_results这三者为系统字符集编码
查看linux系统编码:
[root@localhost ~]# echo $LANG
zh_CN.UTF-8

服务端(即mysql本身)主要更改:character_set_database,character_set_server 的编码,

备注:我们创表的时候的默认b编码跟随mysql本身,创表的时候最好考虑编码,或者指定编码
CREATE DATABASE yourdbname DEFAULT CHARSET utf8 COLLATE utf8_general_ci;

线上数据库修改字符集:
例如latin1–>utf8
1、库及表结构导出,sed 批量修改改为utf8
2、导出所有数据。
3、修改mysql服务端和客户端编码为utf8
4、删除原有的库表及数据
5、导入新的建库及建表语句
6、导入数据

一般情况下,不到万不得已不要修改线上编码,因为需要停库操作。

查看mysql变量:show variables;查看mysql状态: show global status;在线修改变量:set global key_buffer_size=999999;查看:mysql> show variables like "key_buffer%";+-----------------+--------+| Variable_name   | Value  |+-----------------+--------+| key_buffer_size | 999424 |+-----------------+--------+1 row in set (0.00 sec)
阅读全文
0 0
原创粉丝点击