工作时,如果遇到乱码、或是业务扩展需要支持更多字符、或是系统迁移和升级,我们不可避免地遇到修改数据库字符集的需要。该这么进行修改呢? 前面我们在《如何对默认字符集和校对规则进行修改?》已经很清楚地说了,ALTER DATABASE 或 ALTER TABLE 命令对已经存在的数据没有作用,只对新创建的表或记录生效。如果想修改已存在数据的字符集,需要先将数据导出,经过适当的调整后,再重新导入。

那么解决问题的方法就很清晰了,导出数据-修改字符集-导入数据;

举个例子:

在数据库dotcpp下面有张dotcpp_user表格,我们先看看dotcpp数据库的默认字符集是什么:

USE dotcpp;

SHOW CREATE DATABASE dotcpp;

看表知道,默认字符集(default cahracter set)是utf8mb4,校对规则是utf8mb4_0900_ai_ci(ci-不区分大小写 ai-不区分重音)。

现在要将dotcpp中的表dotcpp_user换个字符集,暂且换成gbk吧(注意utf8mb4兼容性远胜于gbk)

1. 开始导出数据(通过mysqldump实现),CMD输入(注意这里是需要通过原字符集解码才能导出文件):

mysqldump -u Dotcpp -p --default-character-set=utf8mb4 dotcpp dotcpp_user>C:\Users\dotcpp\Desktop\DotcppProgramming\dotcpp_changed.sql这是我们在路劲下会生成一个dotcpp_changed.sql的文件:

2.记事本打开该sql文件并进行修改:

找到CREATE TABLE语句:

改:

CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;

为:

DEFAULT CHARSET=gbk COLLATE=gbk_chinese_ci;

保存即可!

3.导入数据:

创建一个新的数据库,姑且叫test并在创建时定义字符集为gbk;

CREATE DATABASE test

CHARACTER SET gbk

COLLATE gbk_chinese_ci;CMD输入:

mysql -u Dotcpp -p --default-character-set=gbk test < C:\Users\dotcpp\Desktop\DotcppProgramming\dotcpp_changed.sql

解释:

--default-character-set=gbk (设置导入字符集)

test < (使用test数据库)

然后切换数据库并查看表的字符集:

USE test;

SHOW CREATE TABLE dotcpp_user \G;得到:

可以看到字符集已经是gbk了。