2015-04-05 72 views
1

我有兩個MySql數據庫,在不同的服務器上。複製後編碼混合

我複製從數據庫1的內容數據庫2.

DATABASE 1

包含在UTF8_unicode_ci一切
通過PHP連接與做set_charset(utf8)

DATABASE 2

相同1

複製

我複製內容從數據庫1,數據庫2,如下所示:

內容在文件印刷JSONfile.phpheader('Content-type: application/json; charset=utf-8')和PHP json_encode()

內容通過php與file_get_contents(JSONfile.php)和`json_decode()``獲取。

,然後保存到DATABASE 2

旁註:我有我使用的服務器上覆制內容沒有別的辦法。不允許遠程連接。

問題:

當我從DATABASE 2檢索數據並顯示它們(總是使用元字符集UTF8)似乎出現一些奇怪的符號,就像這樣:

... autorizar拉restauración德拉PINTURA ALAInmaculadaâ去弗蘭......

注:mb_detect_encoding()此字符串返回:UTF-8

只是嘗試,我做過utf8_decode()和它進入:

... LA飲食德拉PINTURA的La Inmaculada德...

其中修復了一些它與非怪混合奇怪。

所以,在某處肯定有錯誤。

任何想法找到錯誤?

編輯: - 數據庫1的內容來源 -

數據庫1所有內容,是不同網站上SCRAPE的結果。
所有擦除都完成打開與HTML元字符集UTF8網站。
有些來源有&Xacute;實體,有些則不。

編輯2

轉換爲十六進制上數據庫1

Despué小號德DOS - > 4465737075c3a97320646520646f73

轉換爲十六進制上數據庫2

Después de dos - > 4465737075c3a97320646520646f73 (同上)

所以問題不在於從一個數據庫複製到另一個。

我一直在調查,有一件很奇怪的事情。在數據庫(兩者都有)上,當我通過phpMyAdmin進行訪問時,有一些字段顯示爲「camión」。但是在顯示編碼的問題領域,如下所示:Después

我不知道phpMyAdmin應該顯示utf8格式還是可讀的格式。但是,同一張桌子之間的這種區別肯定是找到問題的大門。

THE SHOW CREATE TABLE回報:

CREATE TABLE `contents_data` (
`id` bigint(20) unsigned NOT NULL, 
`title` varchar(200) COLLATE utf8_unicode_ci NOT NULL, 
`main_img` varchar(250) COLLATE utf8_unicode_ci NOT NULL, 
`data` text COLLATE utf8_unicode_ci NOT NULL, 
PRIMARY KEY (`id`), 
CONSTRAINT `ContentsDataIdFK` FOREIGN KEY (`id`) REFERENCES `contents` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci 

編輯

現場做山坳(HEX)與字符串 「城堡」 返回 「416c63e17a6172」

非常好奇的事情:

在上面顯示的表中,字段VARCHAR e在所有行中,ncodes重音,以及字段TEXT都會給您帶來麻煩!

More infos: See the change in accents, for fields VARCHAR and TEXT

欄目有: 「VARCHAR」 和 「文本」 (看更多的CREATE TABLE以上代碼)

注意:同樣的事情發生每一行中,不管其來源的刮痕。

+1

html實體'ó'不受MySQL中任何內容的影響,所以我們可以忽略這種情況。除了數據庫中的不一致以及無法搜索('WHERE','GROUP BY','ORDER BY')之外,應該沒有問題。我認爲'scrap'應拼寫'scrape'? – 2015-04-06 17:31:33

+0

@RickJames - 更新了報廢文件(對不起,錯過了,謝謝。) - 我再次編輯了這個問題,以顯示有關該案例的更多有用信息。我仍在研究它。非常感謝您花時間閱讀我的文章。我真誠地贊同它。 – 2015-04-06 18:12:31

+1

請在'camión'情況下選擇col,HEX(col)...'。如果你在單個表中有一個單獨的列,並且有一些'ó'和一些'''',它不會很容易修復。 – 2015-04-06 18:19:41

回答

1

當您將set_charset設置爲(或默認爲)latin1並且該列的定義爲CHARACTER SET latin1時,您可能已存儲該「o-acute」。

案例1即翻C3B3(UTF8十六進制爲鄰急性)到(十六進制C3在LATIN1)和³(B3在LATIN1)。

SELECT col, HEX(col) ...看看現在有什麼。也做SHOW CREATE TABLE得到CHARACTER SET

編輯)在這種情況下,做2-step ALTER,肚裏像

ALTER TABLE Tbl MODIFY COLUMN col VARBINARY(...) ...; 
ALTER TABLE Tbl MODIFY COLUMN col VARCHAR(...) ... CHARACTER SET utf8 ...; 

,其中長度足夠大,其他...有任何其他(NULL等)是已經在列上。

同樣,TEXTBLOBTEXT

如果col在任何索引中,您可能想要在第一個ALTERADD INDEX中的DROP INDEX。 (這是爲了提高效率,並且可能避免索引限制。)

案例2或者它可能是「雙重編碼」 - HEX不會是C3B3,而是更長的東西。

一旦您確定了這種情況,我們可以討論該怎麼做。

Blog with further discussion

+0

感謝您認真對待您的時間。我編輯了我的問題來解釋來源的來源,所以我們假設它是案例1,但並非總是如此。你我做什麼aboit它?再次感謝。 – 2015-04-06 10:25:58

+1

我添加了案例1的詳細信息。 – 2015-04-06 18:13:22

+0

因此,由於field TEXT給出了所有的麻煩,並且字段VARCHAR在所有行中工作正常,我應該使用TEXT-> BLOB-> TEXT還是有其他解決方法? – 2015-04-06 19:16:11