占个坑。
今天在向本机搭建的MySQL数据库插入中文的时候报错了。
使用 show variables like 'char%'; 及 show variables like 'collation%'; 发现许多项是latin。意识到是配置文件的问题。
去找配置文件的时候,竟然没找到配置文件(记得以前配置过的,难道删了?)。然后看 mysql.server 这个脚本,发现my.cnf 配置文件除了可以放到 /etc 下之外还可以放到用户的家目录,还可以放到安装的位置 /usr/local/mysql。为了目录规整,于是决定放到安装的位置下。
将配置文件加入如下内容:
[client]character-set-client=utf8mb4[mysqld]character-set-server=utf8mb4
collation-server=utf8mb4_unicode_ci[mysql]default-character-set=utf8mb4
这段内容是当初配置的时候从stackoverflow中找到的,稍微修改了一下。stackoverflow中问题的位置(https://stackoverflow.com/questions/3513773/change-mysql-default-character-set-to-utf-8-in-my-cnf),采用的是一个在配置文件中加入便便emoji的人的答案。
暂时没有去翻mysql的文档以清楚这些配置项代表什么。
下面说一个怪异的行为:
当我使用mysql命令连接到数据库之后,使用上文提到的两条show语句,发现配置是生效的。但是当我尝试插入中文时,依然报错。回头使用show 命令查看配置的时候,发现 character_set_database 和 collation_database 这两项又变成了latin。试过几次依然是同样的情况。
后来突然想到可能是数据库也设置了编码,使用mysql workbench查看对应的表的编码,果然是latin,然后查看对应的库的编码,也是latin。
现在已经修改配置文件了,重新创建一个新的数据库时,编码方式已经是utf8mb4了。
现在问题成了如何修改已有的数据库的默认字符集。
通过查看MySQL手册(https://dev.mysql.com/doc/refman/5.7/en/alter-database.html)得知,可以这样:
alter database character set utf8mb4
alter database collate utf8mb4_unicode_ci
改完数据库的默认编码之后,数据库里原先创建的表的编码还没修改呢,修改表的编码方式与修改数据库的编码方式类似,无非就是将database换成table,将换成
发现改完表之后,表中的已有字段的字符集还是latin,修改字段这个与前两个不太一样,使用以下语句:
alter table change character set utf8mb4;
经过这一系列修改之后,终于可以插入中文了。
为了避免修改的问题,最好在最初搭建数据库的时候就将字符编码配置好。
还遗留了许多问题需要明确,比如,配置文件中的collation代表了什么?配置文件应该怎么写最合适?字符集的配置在数据库/表/字段 之间是如何的继承关系?