mysql的编码问题吗_MySQL编码问题探究

占个坑。

今天在向本机搭建的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代表了什么?配置文件应该怎么写最合适?字符集的配置在数据库/表/字段 之间是如何的继承关系?

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值