Mysql

mysqldump 使用和不使用 –no-create-info 轉儲不同的數據

  • January 8, 2021

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( èis 0xC3A8)
  • dump_test2.sql將其編碼為0x63725CE86D65( èis 0x5CE8)

從正常工作中恢復轉儲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 Docsutf8如果未指定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在載入轉儲時顯式命名要使用的字元集。

引用自:https://dba.stackexchange.com/questions/282824