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)