公司内的一同事(刚弄技术的)最近在学习数据库,其在建立的mysql为库里创建了一个名为student的表,结果其在插入汉字后,再通过select查询发现汉字变成了乱码 ,而英文字符正常。以下是帮其解决的步骤及对mysql编码方面的一句话总结。

一、查看数据库编码

1、查看默认字符集

 1mysql> SHOW VARIABLES LIKE 'character_set_%';
 2+--------------------------+----------------------------+
 3| Variable_name | Value |
 4+--------------------------+----------------------------+
 5| character_set_client | latin1 |
 6| character_set_connection | latin1 |
 7| character_set_database | latin1 |
 8| character_set_results | latin1 |
 9| character_set_server | latin1 |
10| character_set_system | utf8 |
11| character_sets_dir | /usr/share/mysql/charsets/ |
12+--------------------------+----------------------------+
137 rows in set (0.00 sec) 

2、查看排序方式

1mysql> SHOW VARIABLES LIKE 'collation_%';
2+----------------------+-------------------+
3| Variable_name | Value |
4+----------------------+-------------------+
5| collation_connection | latin1_swedish_ci |
6| collation_database | latin1_swedish_ci |
7| collation_server | latin1_swedish_ci |
8+----------------------+-------------------+
93 rows in set (0.00 sec)

注:以上部分也可以通过status部分查到,这里对定位该问题作用并不大,这里只是把相关的命令都进行下列举。

二、查看数据库database编码及修改

1、查看database编码

通过以下命令查看

1mysql> show CREATE database  test;
2/*查询结果为*/
3create database name character set utf8; 
4CREATE DATABASE `test` /*!40100 DEFAULT CHARACTER SET utf8 */

2、修改database编码

如果编码是默认的latin1想改为uft8 ,则可以执行下面的语句:

1mysql> alter database name character set utf8;

三、查看表tables编码及修改

1、查看table编码

1mysql> show create table student;
2DROP TABLE IF EXISTS `student`;
3CREATE TABLE `student` (
4  `id` int(11) NOT NULL,
5  `name` varchar(10) DEFAULT NULL,
6  `age` int(11) NOT NULL,
7  `addr` varchar(20) CHARACTER SET latin1 DEFAULT NULL,
8  PRIMARY KEY (`id`)
9) ENGINE=InnoDB DEFAULT CHARSET=latin1;

2、修改表字段编码

1mysql> alter table student character set utf8;

四、修改列col编码及修改

如第三部分tables中的语句,其中addr varchar(20) CHARACTER SET latin1 DEFAULT NULL 中的addr的编码就是latin1,现将其改为utf8 :

1mysql>  alter table student modify addr varchar(50) CHARACTER SET utf8;

五、客户端编码与服务端不一致时乱码

还有一种情况就是当客户端使用的编码与服务端编码不一致时,查询出的结果也会是乱码,想要看到非乱码的结果可以在执行 sql语句前加上一句:

1SET NAMES 'utf8';
2其相当于下面三句
3SET character_set_client = utf8;
4SET character_set_results = utf8;
5SET character_set_connection = utf8;

六、修改编码前旧的历史数据编码的转换

1、执行:mysqldump –opt -hlocalhost -uroot -p*** –default-character-set=lantin1 dbname > /usr/local/dbname.sql

2、将 dbname.sql文件中的create table语句的CHARSET=latin1改为CHARSET=utf8

3、在dbname.sql文件中的insert语句之前加一条”set names utf8;

4、将dbname.sql转码为utf-8格式,建议使用UltraEditor,可以直接使用该编辑器的”转换->ASCII到UTF-8(Unicode编辑)”,或者将文件另存为UTF-8(无BOM)格式

5、执行:mysql -hlocalhost -uroot -p*** –default-character-set=utf8 new_dbname < /usr/local/dbname.sql