簡體   English   中英

MySQL在導入時不會保留字符信息

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM