D 的个人博客

开源程序员,自由职业者

小而美的 Java 博客系统 Solo
Golang 在线 IDE Wide
黑客与画家的社区 Sym
  menu
398 文章
1,769 评论
3343044 浏览
4 当前访客
ღゝ◡╹)ノ❤️

MySQL 迁移 utf8 到 utf8mb4

MySQL 版本和驱动

  • MySQL 至少是 5.5.3+
  • mysql-connector-java 至少是 5.1.13,修改连接串参数 characterEncoding=UTF-8

历史数据迁移

生成表字符迁移 SQL:

SELECT
	CONCAT(
		'ALTER TABLE `',
		TABLE_NAME,
		'` CONVERT TO CHARACTER SET utf8mb4 COLLATE utf8mb4_general_ci;'
	) AS mySQL
FROM
	INFORMATION_SCHEMA. TABLES
WHERE
	TABLE_SCHEMA = 'your_schema'

生成后执行一把,这样表和列的字符集就改完了。我这里通过修改表的字符集就自动修改列的了,最好自己确认下列是否已经改对。

修改库字符集:

ALTER DATABASE `your_schema` CHARACTER
SET = utf8mb4 COLLATE = utf8mb4_general_ci;

上面示例代码中的 COLLATE(排序规则)请按需修改。

关于连接串参数 characterEncoding

有的时候可能会觉得是写错了,应该用 characterEncoding=utf8。其实 UTF-8 是允许客户端发送多种字符集(三字节 utf8 /四字节 utf8mb4)的配置。

如果要使用 utf8mb4 有两种方案:

  1. 在连接串中指定 characterEncoding=UTF-8,MySQL 服务端不用做任何修改
  2. 修改 MySQL 服务端配置后重启,连接串中移除 characterEncoding=utf8
[mysql]
default-character-set = utf8mb4
[mysqld]
character-set-server = utf8mb4
collation-server = utf8mb4_general_ci

具体细节请参考这里这里

评论
  • 这样多爽呐!😀😁🤣😂😄😅😆😇😍😌😋☺️🙂😊🤠🤡🐒🐔🦆🙊🐽🦇🐌🐞🐜📠📷💻📲📱💾💽🚜🚌🚙🚕🚗🚍🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳🇨🇳

    Reply
  • 卧槽?终于可以输入emoji了???😁😝😁😝😁😝😁😝😁😝😁😝😁😝😁😝

    Reply
  • 前天刚刚从sqlite切换到mysql
    http://tujie8.net/blogs/linker

    Reply
  • 哈哈,

    Reply
  • MySQL 用着还行

    Reply
  • mysql的坑啊,为啥不考虑用PostgreSQL?

    Reply
  • Reply
  • 数据库编码不同关联会 导致不走索引吗?

    Reply
  • Reply
  • 是不是 utf8mb4 才能保存 Emoji

    Reply