mysqldump 使用和不使用 –no-create-info 轉儲不同的數據
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
mysqldump --hex-blob test_db test > dump_test.sql mysqldump --hex-blob --no-create-info test_db test > dump_test2.sql
請讓我們知道兩個轉儲之間的十六進制值是否保持不變。
更新 2021-01-08 14:15 EST
嘗試更改字元集
MySQL Docs說
utf8
如果未指定mysqldump將使用國際化選項 以下選項更改 mysqldump 命令如何使用國家語言設置來表示字元數據。
–character-sets-dir = dir_name
安裝字元集的目錄。請參見第 10.15 節,“字元集配置”。
–default-character-set=charset_name
使用 charset_name 作為預設字元集。請參見第 10.15 節,“字元集配置”。如果沒有指定字元集,mysqldump 使用 utf8。
–no-set-names, -N
關閉 –set-charset 設置,與指定 –skip-set-charset 相同。
–set-charset
將 SET NAMES default_character_set 寫入輸出。預設情況下啟用此選項。要禁止 SET NAMES 語句,請使用 –skip-set-charset。
只需添加
-N
以忽略字元集或用於--set-charset
在載入轉儲時顯式命名要使用的字元集。