我正在寻找最安全的方法来在 .sql 备份中保存数据库数据。
这个:
mysqldump -u root -p DBName > backupName.sql
还为我的数据库输出这些行:
DROP TABLE IF EXISTS `tableName`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `tableName` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`col1` int(11) unsigned NOT NULL,
`col2` int(11) unsigned NOT NULL,
...
PRIMARY KEY (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;
/*!40101 SET character_set_client = @saved_cs_client */;
这行编码如何工作?
/*!50503 SET character_set_client = utf8mb4 */;
我记得这些数据是用一些
utf8
编码保存的,但不是用utf8mb4
编码,也许utf8mb4
可以正确处理所有子集,如utf8
和utf8_general_ci
和utf8_unicode_ci
?
(我使用 Ubuntu 和 MySQL 8)
是的,
utf8mb4
是utf8
的超集。
utf8
仅支持 UTF-8 标准的基本多语言平面 — 即 1 字节、2 字节和 3 字节代码点。
utf8mb4
支持 utf8
所做的一切,此外还支持 UTF-8 标准的补充多语言平面。
从 MySQL 8.0.28 开始,
utf8
现在称为 utf8mb3
。据记录,MySQL 的未来版本将重新使用 utf8
别名为 utf8mb4
字符集。
character_set_client
仅描述客户端用于对其发送的字符数据进行编码的字符集。如果存在从客户端字符集到相应表使用的任何字符集的有效转换路径,则这不必与每个表使用的字符集相同。
换句话说,如果将客户端字符集设置为 utf8mb4,并且表使用 utf8(子集),只要客户端不从补充 utf8 平面发送 4 字节字符(这包括例如表情符号)。
utf8_general_ci
和 utf8_unicode_ci
不是字符集,它们是排序规则。这根本不影响字符串的存储,但它会影响构建索引时使用的排序顺序,并且还会影响唯一约束的字符等效性。