Mysql

如何強制 mysqldump 產生 /*!40101 SET character_set_client = utf8mb4 */;

  • January 27, 2020

我正在嘗試轉儲我的數據庫,該數據庫設置為並且僅包含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 是一個過時的不受支持的數據庫版本(是的,我知道,它很複雜。它總是如此。)

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