MySQL Windows上编码问题和解决方法

来源:互联网 发布:王后将相宁有种乎 编辑:程序博客网 时间:2024/05/19 02:29

在中文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: 0MariaDB [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目录下。

0 0