2009-11-05 89 views
10

我正在將數據庫從mysql遷移到postgresql。 MySQL數據庫的默認排序規則是UTF8,postgres也使用UTF8,而我使用pg_escape_string()對數據進行編碼。無論出於何種原因,不過,我遇到了不好的編碼一些時髦的錯誤:PostgreSQL + PHP + UTF8 =用於編碼的無效字節序列

pg_query() [function.pg-query]: Query failed: ERROR: invalid byte sequence for encoding "UTF8": 0xeb7374 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client"

我一直在關注着試圖弄清楚這一點,並注意到PHP是做一些奇怪的;如果一個字符串中只有ascii字符(例如「hello」),則編碼爲ASCII。如果字符串包含任何非ASCII字符,則表示編碼是UTF8(例如「Hëllo」)。

當我在已經是UTF8的字符串上使用utf8_encode()時,它殺死了特殊字符,並使它們全部搞砸了,所以......我能做些什麼才能使它工作?

(確切的字符,現在掛起來的「」,但不是隻查找/替換,我想找到一個更好的解決方案使這個有點問題不會再次發生)

回答

1

BTW ,UTF-8中的ASCII字符串完全相同,因爲它們共享相同的前127個字符;所以ASCII中的「Hello」與UTF-8中的「Hello」完全相同,因此不需要轉換。

表中的排序規則可能是UTF-8,但是您可能無法使用相同的編碼從其中獲取信息。現在,如果您對pg_escape_string提供的信息有任何疑問,可能是因爲您認爲從MySQL獲取的內容使用UTF-8編碼,而不是。我建議你看看this page on MySQL documentation並查看連接的編碼;您可能從排序爲UTF-8的表中獲取,但您的連接類似Latin-1(其中特殊字符(如çéèêöà等不會使用UTF-8編碼))。

+0

經過幾個小時的玩弄之後,我實際上開始認爲mysql已經允許非utf8字符串進入數據庫,這是什麼導致的問題.. – Ian

6

很可能,MySQL數據庫中的數據不是UTF8。這是一個很常見的情況。 MySQL至少不會對數據做任何適當的驗證,所以只要你的客戶聲稱它是UTF8,它就會接受你以UTF8的身份投擲的東西。他們可能已經修復了(或者不知道他們是否認爲它是一個問題),但是你可能已經在db中編碼了不正確的數據。當然,PostgreSQL在加載時會執行完整的驗證,因此可能會失敗。

您可能想通過像iconv這樣的設置來忽略未知字符或將其轉換爲「最佳猜測」。

+0

準確iconv!謝謝。 –

相關問題