[英]MySQL won't maintain character information while importing
我正在嘗試導入大型SQL文件; 由mysqldump在一台服務器上創建,然后用iconv轉換; 使用以下命令:
$ mysqldump -uxxx -p xxx > data.sql
$ iconv -f UTF-8 -t ISO-8859-1//TRANSLIT data.sql data.iconv.sql
我注意到數據庫中的“ \\ x91”在轉儲中已變成“ \\ xc3 \\ x82 \\ xc2 \\ x91”,因為mysqldump嘗試將所有內容轉換為utf-8。 我使用iconv將其轉換回“ \\ x91”。 如果不轉換它們,它們最終將成為新服務器上的“ \\ xc2 \\ x3f”; 而不是像現在那樣只是“ \\ x3f”。
因此,如前所述,cp1252編碼具有一些唯一的字符,例如“ \\ x91”和“ \\ x92”。 在新數據庫中,這兩個字符都變為“ \\ x3f”。 這是我用來導入的命令:
$ /opt/mysql5/bin/mysql -uxxx -p -Dxxx < data.iconv.sql
誰知道這是怎么發生的以及如何預防呢? 知道這一點,我應該能夠完全照原樣遷移數據。
額外的信息:
我將此資源用於iconv-things。 如您所見,在此頁面上,另一個人也遇到了cp1252的問題; 也許這就是原因。
服務器版本為:
舊主機:適用於pc-linux-gnu(i486)的版本10.10 Distrib 5.0.18新主機適用於:pc-linux-gnu(i486)的版本10.10 Distrib 5.0.51
在我的系統上,mysqld默認使用瑞典語的歸類將數據保存在latin1中。 同樣,mysql命令行客戶端默認使用latin1提供數據。 另一方面,mysqldump默認為utf-8。
通過mysqldump導出數據然后使用mysql命令行客戶端導入時,這會導致問題-這兩個字符集不共有的字符會發生突變。
解決方案是使mysqldump使用其他命令來修飾數據,這些命令將正確設置mysql客戶端字符集:
mysqldump --set-charset ...
默認情況下,這會將“ set name = utf-8
”添加到轉儲的數據中。 現在,可以由mysql客戶端將其干凈地導入。
附加選項“ --default-character-set=xxx
”可與mysqldump一起使用,以將轉儲轉換為utf-8以外的格式。
使用-set-charset
選項應完全避免使用iconv。
如果您的數據是cp1252,為什么要告訴iconv其utf-8?
我仍然沒有找到可行的解決方案。 我們將嘗試使用建立2個連接並僅從一個連接中選擇並更新另一個連接的腳本進行遷移...
如果mysql轉換為utf-8,則需要:
iconv -f utf-8 -t IBM-1252 xxxx
這應將打開的報價轉換回x“ 91”。 “ xc291”實際上是utf-8的公開報價。
您正在使用哪個版本的mysqldump?
最新版本5釋放包裝表轉儲,其中包含設置字符集的命令,例如:
SET @saved_cs_client = @@character_set_client;
SET character_set_client = utf8;
CREATE TABLE ...
...
...
SET character_set_client = @saved_cs_client;
是否存在這些是否會影響您的進口?
嘗試:-
iconv -f IBM-1252 -t ISO-8859-1
不知道為什么我以前的答復被標記為下來。 utf-8不是ASCII! 所有的7位utf字符都與7位的ASCI字符集相同,但是第一位b'1000000'在UTF-8中具有特殊含義,表示該字符是一個包含兩個,三個或四個字節的Unicode字符。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.