2011-07-20 16 views
1

我想從另一堆PostgreSQL數據庫中的一堆表中的PostgreSQL數據庫中的一堆表中導入一些數據。對於導入我使用PHP,因爲我需要在將數據插入新數據庫之前進行一些數據操作。通過PHP導入一些PostgreSQL數據時出錯

一切都沒有問題,直到某些文本中包含單引號的地方。我試圖插入數據前逃脫這些報價,我得到這個錯誤:

ERROR: invalid byte sequence for encoding "UTF8": 0x96 HINT: This error can also happen if the byte sequence does not match the encoding expected by the server, which is controlled by "client_encoding".

舊的數據庫上的編碼是SQL_ASCII,而新的數據庫上我有UTF8。

我該如何解決這個問題?

+0

你能發佈查詢/數據嗎?也許投射到不同的數據類型可能是選擇 –

回答

1

這可能是因爲你有你的舊數據庫某些Windows 1252編碼的文本中插入(在編碼0x96編碼EN DASH)時。

當服務器編碼爲SQL_ASCII時,PostgreSQL不執行編碼轉換或驗證;它只是存儲和檢索文本,因爲你給它。如果您的舊數據庫使用了UTF8,那麼您不會遇到此問題。希望本應該。

有一個很好的機會,您的所有文本在WIN1252,但它可能是有混合的編碼。最容易做的事情是假設前者並設置客戶端編碼WIN1252在您的遷移腳本:

pg_set_client_encoding($new_database, 'WIN1252'); 

您將此您連接到數據庫上是很重要的。它告訴Postgres,Windows   1252編碼的文本正在進入,並且Postgres需要將其轉換爲UTF-8。

請注意,如果舊數據庫中存在任何UTF-8編碼的文本,它將引發錯誤,或者如果您這樣做,則會變爲mojibake