假设有2个mysql数据库 - src_db
具有utf8
编码并且有几个现有表,dst_db
具有utf8mb4
编码并且是新创建的。以下步骤是否会成功将utf8
中的src_db
个表移至utf8mb4
中的dst_db
表?
首先,从src_db
转储。
mysqldump src_db -uxxx -pyyy > tbls.sql
然后在sql文件中搜索并替换所有出现的utf8
utf8mb4
。
sed -i 's/DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci/DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci/g' tbls.sql
sed -i 's/COLLATE utf8_unicode_ci/COLLATE utf8mb4_unicode_ci/g' tbls.sql
sed -i 's/character_set_client = utf8/character_set_client = utf8mb4/g' tbls.sql
sed -i 's/SET NAMES utf8/SET NAMES utf8mb4/g' tbls.sql
然后,手动修改varchar
列上的任何索引,以仅索引列的前缀。请参阅下面的示例。唯一的修改是在索引定义中添加(191)
。
CREATE TABLE `tbl` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`col` varchar(255) COLLATE utf8mb4_unicode_ci NOT NULL,
PRIMARY KEY (`id`),
KEY `index_tbl_on_col` (`col`(191)),
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci;
最后,将sql文件导入dst_db
。
mysql dst_db -uxxx -pyyy < tbls.sql
导入dst_db
的所有表都是有效的utf8mb4
表吗?