如何強制 mysqldump 產生 /*!40101 SET character_set_client = utf8mb4 */;
我正在嘗試轉儲我的數據庫,該數據庫設置為並且僅包含
utf8mb4
適當的排序規則。我使用以下行:
mysqldump --add-drop-table --add-locks --allow-keywords --complete-insert=TRUE --compress --create-options --databases [database] --default-character-set=utf8mb4 --disable-keys --dump-date --extended-insert=FALSE --hex-blob --lock-tables=FALSE --no-autocommit --no-data --set-charset --order-by-primary --quote-names --routines --single-transaction --skip-quick --triggers -u [user] -h [server] > dump.sql
這很好用,並產生了我想要的輸出,但有一個例外。我的垃圾堆裡到處都是:
/*!40101 SET character_set_client = utf8 */; /*!50001 SET character_set_results = utf8 */; /*!50001 SET collation_connection = utf8_general_ci */;
我已經閱讀了條件註釋,據我了解,這將始終在我們的客戶端/伺服器上執行(伺服器版本:5.6.46 - MySQL 社區伺服器(GPL))。我不明白為什麼將其設置為
utf8
而不是utf8mb4
,並希望它反映我們正確的字元集。這個問題的現有答案都沒有幫助我。
編輯:我最初的文章中的版本不正確
我檢查了 mysql-5.4.46,並在 client/mysqldump.c 中搜尋“SET character_set_client”。
它發現
[:~/Source/mysql-server/client]↥ 9c3a49ec84b* ± grep 'SET character_set_client' mysqldump.c "/*!50003 SET character_set_client = %s */ %s\n" "/*!50003 SET character_set_client = @saved_cs_client */ %s\n" "SET character_set_client = utf8;\n" "SET character_set_client = @saved_cs_client;\n"); "/*!40101 SET character_set_client = utf8 */;\n" "/*!40101 SET character_set_client = @saved_cs_client */;\n", "/*!50001 SET character_set_client = %s */;\n" "/*!50001 SET character_set_client = @saved_cs_client */;\n"
由此看來,“SET character_set_client”的某些實例在此版本中被固定為 utf8,甚至沒有變化。
其中之一是
/*!40101 SET character_set_client = utf8 */;
您引用的錯誤線。檢查目前的 8.0 HEAD 後,我得到
[:~/Source/mysql-server/client]↥ 8.0* ± grep 'SET character_set_client' mysqldump.cc "/*!50003 SET character_set_client = %s */ %s\n" "/*!50003 SET character_set_client = @saved_cs_client */ %s\n" "/*!50503 SET character_set_client = utf8mb4 */;\n" "SET character_set_client = @saved_cs_client;\n"); "/*!50503 SET character_set_client = utf8mb4 */;\n" "/*!40101 SET character_set_client = @saved_cs_client */;\n", "/*!50001 SET character_set_client = %s */;\n" "/*!50001 SET character_set_client = @saved_cs_client */;\n"
因此,雖然仍有固定
SET character_set_client
語句,但它們現在預設為 utf8mb4。請注意,所有其他語句都是 %s-ed,進一步檢查表明它們遵循您--default-character-set=utf8mb4
在命令行中的任何內容。我的建議是你使用更新的 mysql 8.0 二進製文件進行遠端轉儲。一般來說,建議升級,因為 5.6 是一個過時的不受支持的數據庫版本(是的,我知道,它很複雜。它總是如此。)