在中文Windows系统上使用MySQL(MariaDB),字符集问题困绕了好久,通过搜索,解决了问题,整理一下,希望对读者有用,并可以解决问题,并理解该问题。
主要问题是字符集不匹配:客服端字符集,数据库字符集,表字符集,列字符集。
1 MySQL字符集
MySQL存在几个字符集:数据库字符集,数据表字符集,客户端字符集。
1.1 数据库字符集,客户端字符集
数据库字符集和客户端字符集可以通过在命令行下查到:
MariaDB [db_user]> show variables like 'char%';
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\Tools\DEV\mariadb-10.1.10-winx64\share\charsets\ |
+--------------------------+-----------------------------------------------------+
character_set_database 当前数据库字符集,这个是在新建数据库时指定的字符集。
有两种方式:
(1)CREATE DATABASE db_name DEFAULT CHARACTER SET utf8 COLLATE utf8_general_ci;
(2)CREATE DATABASE /*!32312 IF NOT EXISTS*/`quick4j` /*!40100 DEFAULT CHARACTER SET utf8 */;
客户端字符集 是连接数据库使用的字符集,如果字符集与数据库字符集不同,MySQL会实施字符集转换(请参考:http://www.jb51.net/article/30864.htm)
我们使用工具就需要考虑客户端字符集。
1.2 数据表字符集
数据表的字符集可能存在与数据库的字符集不一致的情况(比如在系统运行中修改过字符集,或者指定了其他与数据库不一致的字符集),这样,就会出现“莫名奇怪”的现象。所以前面确认了数据库和客户端的字符集没有问题后,我们还需要确认表的字符集,如果表的字符集不一致,就会出现问题,比如对latin的表写入中文,无论在什么样的字符集,都是没有用的。
查看表的字符集使用命令: show create table <表名>;
| operations | CREATE TABLE `operations` (
`id` int(10) unsigned NOT NULL AUTO_INCREMENT,
`code` varchar(20) NOT NULL,
`name` varchar(50) NOT NULL,
`description` varchar(200) DEFAULT NULL,
UNIQUE KEY `operation_idx` (`id`),
UNIQUE KEY `operation_code` (`code`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8 |
上面最后的DEFAULT CHARSET=utf8,我们建立表的时候也可以指定缺省的字符集,不过一般不指定的为好,缺省使用数据库的字符集。
MySQL中数据库列还有字符集,如果是修改一个表的缺省字符集,那么列的缺省字符集还没有修改过来,需要一同修改。
修改roles表的name列字符集:
alter table roles modify column `name` varchar(50) character set utf8 not null;
修改表的缺省字符集:
alter table user_applications default character set utf8;
(这个方法不会修改列的字符集,如果需要同时修改列的字符集,请使用下面的Convert方法)
alter table user_roles convert to character set utf8;
注意:convert方法对没有varchar字符列时无效,达不到修改表缺省的效果,需要通过default character set方法修改。
2 Windows命令行的MySQL字符集处理
在Windows 命令行下使用,由于我们是中文系统,缺省为GBK编码,所以在使用命令行操作和修改UTF8的数据库/表时,需要修改客户端字符集,如果不修改,就不能查看UTF8中文的数据内容,如果修改,在UTF8下查看就是乱码了。同时还要注意列的字符集,如果单纯修改表的字符集,还不能正确查看和修改表格的内容。
在Windows 命令行下使用MySQL,需要切换字符集到客户端字符集,这样才可以正确使用Utf8 的数据库(专家推荐使用UTF8字符集,这样跨平台好些)。切换字符集的方式有两个方式:
(1)命令行参数的方式
mysql -uroot -p --default_character_set=gbk
(2)在MySQL命令方式
MariaDB [test02]> show variables like 'char%';
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | utf8 |
| character_set_connection | utf8 |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | utf8 |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\Tools\DEV\mariadb-10.1.10-winx64\share\charsets\ |
+--------------------------+-----------------------------------------------------+
8 rows in set (0.04 sec)
MariaDB [test02]> set names gbk;
Query OK, 0 rows affected (0.00 sec)
MariaDB [test02]> show variables like 'char%';
+--------------------------+-----------------------------------------------------+
| Variable_name | Value |
+--------------------------+-----------------------------------------------------+
| character_set_client | gbk |
| character_set_connection | gbk |
| character_set_database | utf8 |
| character_set_filesystem | binary |
| character_set_results | gbk |
| character_set_server | utf8 |
| character_set_system | utf8 |
| character_sets_dir | D:\Tools\DEV\mariadb-10.1.10-winx64\share\charsets\ |
+--------------------------+-----------------------------------------------------+
8 rows in set (0.00 sec)
如前面所示,在缺省为UTF8的配置情况下,通过命令行查看数据库字符集配置全部为utf8,通过set names gbk; 可以修改character_set_client, xx_connection, xx_results为GBK字符集,这样,在命令行下就可以查看和修改中文数据了,如下:
MariaDB [db_user]> update operations set name="创建" where id=1;
Query OK, 0 rows affected (0.04 sec)
Rows matched: 1 Changed: 0 Warnings: 0
MariaDB [db_user]> select * from operations;
+----+--------+------+----------------------------------+
| id | code | name | description |
+----+--------+------+----------------------------------+
| 1 | CREATE | 创建 | 创建权限,可以新建资源 |
| 2 | UPDATE | 修改 | 修改/更新权限,可以修改/更新资源 |
| 3 | READ | 读取 | 读取权限,可以读取资源 |
| 4 | DELETE | 删除 | 删除权限,可以删除资源 |
+----+--------+------+----------------------------------+
4 rows in set (0.00 sec)
MariaDB [db_user]>
3 Navicat 的字符集配置
笔者在这一点上就遇到了麻烦,网上的方法很多,如果没有选择好,那么,你可能就掉坑里了,就是无论你如何配置,都无法有效处理中文内容……
其实Navicat是支持utf8格式的,与命令行不一样。
记住:Navicat连接MySQL数据库是,保存配置与数据库一致即可,不需要指定配置。
如果有问题,请检查数据库字符集配置,尤其是表的字符集配置。
(1)直接使用MySQL字符集
(2)数据库使用数据库的字符集
(3)确认表的字符集与数据库的字符集一致
4 Windows数据库的安装
安装包的安装方式在这里不讨论,而且安装方法网上内容比较多,个人建议使用zip的安装方式,这样就不会在系统重新安装的时候需要重新安装的问题,而且数据文件就在程序目录,测试更方便了。
这个配置文件,如果成功安装后,会出现在:C:\Windows\SysWOW64目录下。