1.插入数据乱码时可以设置插入时的字符集
1.1. set names 字符集;
1.2 mysql -uusername -ppassword –default-character-set=字符集 testdb
+--------------------------+------------------------------+
| character_set_client | utf8 //客户端字符集 |
| character_set_connection | utf8 //连接字符集 |
| character_set_database | latin1 //数据库字符集 |
| character_set_filesystem | binary //文件系统字符集 |
| character_set_results | utf8 //返回字符集 |
| character_set_server | latin1 //服务端字符集 |
| character_set_system | utf8 |
| character_sets_dir | /usr/local/mariadb-5.5.52-linux-x86_64/share/charsets/ |
+--------------------------+------------------------------+
默认情况下,character_set_client,character_set_connection,character_set_results跟操作系统字符集一致。
对于生产环境已有数据的数据库,使用
alter database character set *
alter table tablename character set *
这两个命令都没有更新已有记录的字符集,而是对新创建的表或记录生效。已有记录的字符集的调整,必须先将数据导出,经过修改字符集后重新导入才可完成。
修改过程:
1.导出表结构
mysqldump -uroot -p123456 --default-character-set=latin1 -d dbname>alltable.sql 表示以GBK 字符集进行连接 -d只导出表结构
2.编辑导出的alltable.sql文件,将latin1改成GBK
3.确保数据库不再更新,导出数据
mysqldump -uroot -p123456 --quick --no-create-info --extended-insert --default-character-set=latin1 dbname >alldata.sql
参数说明:
--quit:用于转储大的表,强制mysqldump 从服务器一次一行检索数据而不是检索所有行,并输出到cache内存。
--no-create-info:不创建create table 语句
--extended-insert:使用包括几个values列表的多行insert语法,这样文件更小,I/O也更小,导入数据时非常快。
--default-character-set=latin1 按照原有的字符集导出数据,这样导出的数据中,所有中文都是可见的,不会乱码
4.打开alldata.sql,将set names latin1改为set names GBK
5.建库。
create database dbname default charset gbk;
6.创建表,执行alltable.sql
mysql -uroot -p123456 dbname <alltable.sql
7.导入数据
mysql -uroot -p123456 dbname <alldata.sql