mysqldump
使用/不调用时转储不同的数据表示形式--no-create-info
。
测试用例
首先,创建test
表并用有趣的数据填充它。
CREATE TABLE `test` (
`value` longtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
-- insert 'crème'
insert into test values(UNHEX('6372C3A86D65'));
然后,使用 with 和 without 转储数据--no-create-info
:
mysqldump test_db test > dump_test.sql
mysqldump --no-create-info test_db test > dump_test2.sql
这些文件对crème的编码方式不同:
dump_test.sql
将其编码为0x6372C3A86D65
(è
is0xC3A8
)dump_test2.sql
将其编码为0x63725CE86D65
(è
is0x5CE8
)
从正常工作中恢复转储dump_test.sql
,将恢复完整的行:
mysql test_db < dump_test.sql
恢复转储dump_test2.sql
会产生不正确的结果,其中数据被截断为cr
( 0x6372
)。请注意,表的结构是相同的:
mysql test_db < dump_test2.sql
没有错误也没有警告。这两个文件的不同之处 - 除了编码之外crème
- 仅通过:
-- Table structure for table `test`
--
DROP TABLE IF EXISTS `test`;
/*!40101 SET @saved_cs_client = @@character_set_client */;
/*!50503 SET character_set_client = utf8mb4 */;
CREATE TABLE `test` (
`value` longtext
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
/*!40101 SET character_set_client = @saved_cs_client */;
--
问题
为什么会这样?它在任何地方都有记录吗?我可以/如何正确恢复使用--no-create-info
数据创建的转储?
附加信息
# mysqldump used to dump the database
$ mysqldump -V
mysqldump Ver 8.0.22-0ubuntu0.20.04.3 for Linux on x86_64 ((Ubuntu))
# Server
version_component: Percona Server (GPL), Release '35', Revision '5688520'
version: 5.7.32-35
尝试使用倾倒
--hex-blob
请让我们知道两个转储之间的十六进制值是否保持不变。
更新 2021-01-08 14:15 EST
尝试更改字符集
MySQL Docs说
utf8
如果未指定mysqldump将使用只需添加
-N
以忽略字符集或用于--set-charset
在加载转储时显式命名要使用的字符集。