- 我们有一个数据库,其中表和列的默认字符集设置为utf8编码
- 但是使用utf8的字符集编码,我们无法保存表情符号
- 为了支持表情符号的保存, a( 我们必须将表和列的字符集更改为utf8mb4b( 我们必须将表和列的排序规则更改为 utf8mb4_unicode_ci c( 更新我们的 JDBC 驱动程序,使其支持 Unicode 编码
通过上述更改,我们可以将表情符号保存在我们的列中。
问题:1(我是否需要删除现有索引(varchar 列(并像以前一样使用 utf8 重新创建索引,每个字符过去占用 3 个字节,现在使用 utf8mb4 编码将占用 4 个字节?
索引是指向表行的指针的有序列表。 排序基于索引列的CHARACTER SET
和COLLATION
。 如果更改任一,则必须重新生成索引。 "指针"(在此上下文中(是PRIMARY KEY
的副本。
您应该执行以下一项或另一项操作
ALTER TABLE tbl CONVERT TO CHARACTER SET utf8mb4 COLLATE ...,;
这将转换表中的所有文本列。 或者,如果您需要保留一些当前字符集/排序规则,请更改每列:
ALTER TABLE tbl MODIFY col_name ... CHARACTER SET utf8mb4 COLLATE ...;
其中第一个"..."是列定义的其余部分(VARCHAR,而不是 NULL,等等(。
将重新生成涉及正在更改的列的任何索引。 特别要注意的是,VARCHAR
PRIMARY KEY
实际上位于每个二级索引中。
排序规则utf8mb4_unicode_ci
相当古老; 您可能更喜欢utf8mb4_unicode_520_ci
,特别是因为它将表情符号处理为不同的而不是混为一谈(IIRC(。
utf8 是 utf8mb4 的子集这一事实无关紧要;MySQL将其视为一种变化,并且没有采取任何捷径。