2009-10-14 68 views
25

沒有等價我得到以下異常:性格與編碼UTF8在WIN1252

Caused by: org.postgresql.util.PSQLException: ERROR: character 0xefbfbd of encoding "UTF8" has no equivalent in "WIN1252" 

有沒有根除此類字符的方式,無論是通過SQL或程序?
(SQL解決方案應該是首選)。

我想使用WIN1252連接到數據庫,但它會給出同樣的問題。

+1

請告訴我這個問題的解決方案,因爲我有類似的問題。 – TopDeveloper 2011-09-12 23:03:01

+0

將數據庫從LATIN1遷移到UTF8後,我的設置出現類似錯誤。當UNICODE被期望時,問題是ANSI ODBC驅動程序。 – plang 2011-11-24 09:45:55

回答

5

當您收到此消息時,您會做什麼?你將文件導入到Postgres中嗎?由於devstuff表示它是一個BOM字符。這是一個Windows首字符寫入文本文件的字符,當它以UTF8編碼保存時 - 它是不可見的0寬字符,因此在文本編輯器中打開時不會看到它。

嘗試在記事本中打開此文件,保存爲ANSI格式,並在文件中添加(或替換類似的)set client_encoding to 'WIN1252'行。

+1

我們從源數據庫(UTF-8編碼的Teradata DB)獲取一些數據並將其寫入目標數據庫(WIN1252編碼的Postgres DB)。 我認爲我們沒有辦法將這些字符轉換爲WIN1252,因爲它們不受支持,這就是爲什麼我們想要從源數據庫獲取或保存到目標數據庫時忽略這些字符的原因。 – 2009-10-15 04:11:51

+0

然後,您可以先將這些數據導入到bytea中,然後使用convert_from(string bytea,type text)。您可以使用「創建轉換」來定義自己的功能進行轉換。該功能可以忽略不在WIN1252中的字符。 更容易使用程序篩選器爲您的數據「iconv -f utf-8 -t windows -1252 // translit」會做。 – Tometzky 2009-10-15 12:53:06

+1

更簡單:將數據導入PostgreSQL中的臨時UTF-8數據庫,使用pg_dump導出到文本文件,使用「iconv -f utf-8 -t windows-1252 // translit」將文件轉換爲WIN1252,將文件轉換回UTF- 8使用「iconv -t windows-1252 -t utf-8」,然後將該文件導入新的WIN1252數據庫。 – Tometzky 2009-10-15 13:53:57

4

不要干擾角色,他們是真實的,並有很好的理由使用。而是,Win1252。

+0

我希望我可以,這是一個需求:) – 2009-10-14 10:00:49

1

這看起來像字節序列0xBD,0xBF,0xEF作爲小尾數整數。這是Unicode字節順序標記(BOM)字符0xFEFF的UTF8編碼形式。

我不確定Postgre的正常行爲是什麼,但BOM通常僅用於輸入流開頭的編碼檢測,並且通常不會作爲結果的一部分返回。

在任何情況下,您的例外都是由於此代碼點在Win1252代碼頁中沒有映射。大多數其他非拉丁字符也會出現這種情況,例如亞洲腳本中使用的字符。

你可以更改數據庫編碼爲UTF8而不是1252嗎?這將允許你的列包含幾乎任何角色。

+0

不,我們不能將目標數據庫編碼更改爲UTF8。 – 2009-10-14 10:17:20

+1

0xFEFF的UTF-8編碼形式是「0xEFBBBF」,而不是「0xEFBFBD」。 OP's是UTF-8編碼形式的替換字符0x0fffd:「 」 – 2013-10-31 18:42:20

19

我有類似的問題,我通過在客戶端中設置編碼爲UTF8並使用\encoding UTF8解決,然後嘗試INSERT INTO foo (SELECT * from bar WHERE x=y);。我的客戶使用WIN1252編碼,但數據庫是UTF8,因此出現錯誤。

更多信息可在PostgreSQL wiki下的Character Set Support(devel文檔)中找到。

1

我能夠通過使用Postgres的子功能和選擇,而不是繞過它:

select substring(comments from 1 for 200) from billing 

註釋的特殊字符開始每場在最終解決它有很大的幫助。

0

我有一個非常類似的問題。我有一個從SQL Server到PostgreSQL數據庫的鏈接服務器。我在表格中使用openquery聲明選擇的一些數據有一些在Win1252中沒有相同的字符。問題在於我用於連接的系統DSN條目(在ODBC數據源管理器下找到)被配置爲使用PostgreSQL ANSI(x64)而不是PostgreSQL Unicode(x64)。使用Unicode支持創建一個新的數據源並創建一個新的修改後的鏈接服務器,並在您的openquery中引用新的鏈接服務器爲我解決了這個問題。快樂的時光。

0

這個問題在我們19/11/2016左右出現,我們的舊版Access 97應用程序訪問postgresql 9.1數據庫。

這是通過將驅動程序更改爲UNICODE而不是ANSI來解決的(請參閱plang註釋)。

0

以下是我的工作原理: 1在sp_configure中啓用臨時查詢。 2爲您連接的PostgreSQL服務器添加ODBC DSN。 3確保您有ANSI和Unicode(x64)驅動程序(嘗試使用兩者)。 4運行如下所示的查詢 - 更改UID,服務器IP,數據庫名稱和密碼。 5只是將查詢保留在postgreSQL格式的最後一行。

EXEC sp_configure 'show advanced options', 1 
RECONFIGURE 
GO 
EXEC sp_configure 'ad hoc distributed queries', 1 
RECONFIGURE 
GO 

SELECT * FROM OPENROWSET('MSDASQL', 
'Driver=PostgreSQL Unicode(x64); 
uid=loginid; 
Server=1.2.3.41; 
port=5432; 
database=dbname; 
pwd=password', 

'select * FROM table_name limit 10;')