1. 怎么了(问题)
之前有一个张MySQL表用一个使用了utf8
编码的text
类型的content
字段来保存文章。最近发现当文章中有emoji表情时,保存会失败:
Incorrect string value: '\\xF0\\x9F\\x91\\x87\\xF0\\x9F...' for column 'content' at row 1
原来是utf8
编码不支持emoji,需要使用utf8mb4
编码。
2. 怎么办(方法)
找到问题之后,那么解决办法就有了:
- 修改
content
字段的编码为utf8mb4
; - 程序连接数据库的字符集也改成
utf8mb4
。
当然可以直接使用下面的语句进行修改:
alter table tbl_xxx modify content text character set utf8mb4;
但是对于大表,这个语句会锁表很长时间。对于线上服务来说,不能接受长时间的锁表。
3. Then What?
然后发现有一个工具pt-osc可以直接进行修改而减少锁表时间。pt-osc是percona的一个工具。
下载:
wget percona.com/get/percona-toolkit.tar.gz
直接使用wget
下载就可以了。然后解压进入bin
目录,就会发现一系列工具:
我们需要使用的,就是pt-online-schema-change。
行吧直接上:
pt-online-schema-change \\
-hxxx \\
-Pxxx \\
-uxxx \\
-pxxx \\
--alter "modify title char(128) character set utf8mb4,modify content text character set utf8mb4" \\
D=xxx,t=xxx \\
--execute \\
--print \\
--statistics \\
--no-check-alter
其中-h -P -u -p
就是连接数据库的IP、端口、账号和密码。
接下来在--alter
中就是修改表结构的语句了,主体还是和MySQL的ALTER
语句类似的,只不过这里不需要添加ALTER TABLE xxx
了。
对于多个ALTER
语句,中间可以使用,
分割。
D=xxx,t=xxx
表示对应的数据库和表名。
--execute
指定程序进行修改,为了安全,默认是不进行修改的,需要添加--execute
才能真正执行修改操作。
尝试了一下,果然很方便。