题图:ONE · 插画 | 狐狸狐狸鱼
近些日子在折腾 Hibernate,遇到一个小问题:向 MySQL 数据库插入中文数据的时候会发现乱码,乱码形式表现为“?”。看到第一反应是:这还不简单,MySQL 建表时使用的是默认字符集,改成「UTF-8」不就得了。那就改啊,改完之后测试,顿时感觉心凉了一下。提示错误信息:
我擦,这是什么鬼?刚开始玩 Hibernate 的我一脸懵逼,还能怎么办,Google 啊。
按照网上的解决办法就是在 Hibernate 核心配置文件中的数据库连接 url 后面添加如下代码(“?”后面紧跟代码,没有换行):
?useUnicode=true&characterEncoding=utf-8
再次测试,结果还是上面的错误信息,这就尴尬了。再查,发现我的 MySQL 数据库没有更改默认字符集,MySQL 的默认字符集是“latin1”(鬼知道 MySQL 设计者为什么弄它作为默认字符集)。开整。
可以通过在终端进入 MySQL 然后输入:show variables like '%char%';查看字符集。
图中标注的地方是更改之后,更改之前应该是「latin1」。想要更改 MySQL 的编码,就需要修改 MySQL 配置文件:my.cnf。修改配置文件之前一定要将 MySQL 进程关闭,一定要,不然会出现麻烦。
将 MySQL 安装目录下的my.cnf文件复制到/etc目录下(如果 MySQL 安装目录没有 my.cnf 文件,则直接在/etc中新建一个名为my.cnf的文件)
my.cnf 文件内容如下:
更改完重启 MySQL 测试,心想这下应该可以了吧,然而,还是出现那个错误信息。别慌,Hibernate 要操作的数据库是更改默认编码之前创建的,所以去更改下待操作的数据库的字符集(一开始只更改了表的字符集)。再测试,OK。
所以问题的根本在于数据库的编码。那折腾半天 MySQL 默认编码干啥?直接更改待操作数据库的字符集不就得了?更改 MySQL 默认编码之后再创建新的数据库,就不用再去手动设置字符集,省去了以后的麻烦,也算自己没白折腾。
本文由“壹伴编辑器”提供技术支持
iOS 专属赞赏通道
领取专属 10元无门槛券
私享最新 技术干货