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

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

创表:
mysql> create database chao;
Query OK, 1 row affected (0.00 sec)

mysql> use chao;
Database changed
mysql>  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.sql
insert into user values ("大的米");

source /root/test.sql

或者指定字符集:
mysql -uroot -pqb123 -S /data/3306/mysql.sock --default-character-set=latin1 chao <test.sql

mysql> 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)

猜你喜欢

转载自blog.csdn.net/qq_25611295/article/details/78864062