2011-10-21 98 views
1

我正在研究一個基於PHP的web應用程序,該應用程序有一個現有的MySQL數據庫,其中所有文本列都使用latin1編碼,但它們中包含utf8數據。使用Solr索引包含utf8數據的latin1列

這適用於PHP應用程序,它使用latin1編碼爲數據庫連接來檢索數據,然後直接輸出到瀏覽器,告訴瀏覽器頁面是utf8。

但是,我們現在嘗試使用Solr來使用MySQL JDBC連接器對數據庫建立索引,並且我們在索引中獲取了亂碼字。

這裏是連接字符串:

<dataSource 
    url="jdbc:mysql://localhost/db_name?characterEncoding=latin1&amp;characterSetResults=utf8" 
    user="user" password="password" /> 

有沒有辦法讓Solr的檢索數據作爲latin1的,然後把它當作UTF8無需轉換呢?我試着改變JDBC連接字符串中的characterEncoding和characterSetResults參數,但無濟於事。

我確定解決這個問題的正確方法是將所有文本列轉換爲utf8,但我不想走那條路線(因爲它會打破webapp)。

回答

2

你是對的,正確的方法是修復你的數據庫。相信我,我剛剛經歷了這一點(爲了修復solr安裝,足夠奇怪),並且越早修復它就會導致更少的痛苦。

有兩種方法可以解決您的數據存儲在錯誤的編碼:

  1. mysqldump所有數據LATIN1(--default-character-set=latin1),編輯表定義爲CHARACTER SET=utf8,而不是latin,然後重新導入轉儲。通過修改BINARY第一對每個誤編碼列

    ALTER table MODIFY columns BINARY

    ALTER TABLE MODIFY column VARCHAR(255) CHARSET utf8

  2. 運行兩個ALTER語句時,可以在不運行的latin1 => UTF8轉換欺騙的MySQL,其,在你的情況下,會雙重編碼和打破你的數據。

如果你的數據庫很大,1是要快於2

緊接着,只是配置PHP應用程序使用UTF8的MySQL進行通信。這可以通過發送SET NAMES utf8作爲每個連接的第一個查詢來完成。如果PHP已經向MySQL發送utf8數據,那應該就是你需要做的。

如果在這個非常具體的措辭和詳細的答案之後,您仍然在尋找黑客行爲......嘗試並配置JDBC以UTF8身份進行連接,但是看看是否有辦法讓它在發出前命令任何工作。

如果你提出這個命令:SET NAMES latin1那麼理論上,Solr應該以UTF8的形式連接,並將來自連接的數據作爲UTF8連接,但MySQL會將連接視爲latin1連接,而不是轉換來自latin1列的任何數據。