导入数据时,有以下几个方面会影响MySQL数据库的编码。
MySQL默认安装的编码是latin1
。安装时最好选择为utf8
或utf8mb4
。需要注意的是,MySQL的编码分为客户端(指命令行客户端)和服务器端两部分。
服务器端的编码是指数据库服务器本身的编码,即创建数据库的时,数据库的默认编码。
客户端编码是指使用命令行客户端连接数据库时,使用的编码。比如在命令行里面输入mysql
命令连接数据库,这时就是使用MySQL命令行客户端。
在创建数据库时,可以指定数据库编码。这是决定数据库编码最终的一步,安装时设置的编码只是默认的编码,也就是在创建数据库时,如果没有指定编码,则会使用数据库默认的编码。
在命令行里面输入mysql
命令连接数据库(包括使用source
命令导入数据),会使用MySQL客户端的编码设置连接数据库。在使用MySQL其他客户端直接执行sql文件(如Navicat的“运行SQL文件”功能),也可能会使用MySQL客户端的编码。
在Windows创建的文件格式一般是GBK
编码。Jspxcms的数据库脚本文件使用的是UTF-8
编码。
要做到导入数据不乱码,要做到三点:数据库编码为UTF-8、客户端编码为UTF-8、数据库脚本文件编码为UTF-8。
其中Jspxcms的数据库文件本身就是UTF-8编码,数据库编码在创建数据库的时候可以选择为UTF-8编码。这两个条件较容易达成,但MySQL客户端编码则需要在安装的时候设置,而这一个往往很容易被忽略,且安装之后较难修改(需修改MySQL的配置文件,重启MySQL),是发生乱码的主要根源。即使是使用可视化客户端,如果直接选择执行SQL文件,也是可能会使用MySQL客户端编码。
因此,要避免乱码最好的办法是在确认数据库编码为UTF-8的前提下,打开sql脚本文件,将文件内容复制到MySQL可视化客户端执行(如Navicat的查询窗口)。
这种情况通常为MySQL数据库版本较新且MySQL驱动较旧导致的,如使用MySQL5.7,而MySQL驱动版本较低(如mysql-connector-java-5.1.24.jar
,位于/WEB-INF/lib
目录),这时只要使用新版本的数据库驱动即可解决(如mysql-connector-java-5.1.41.jar
)。