2012-04-09 63 views
1

雖然在Latin1的Postgres的9.1.3插入一些數據出現錯誤:字符編碼「UTF8」的0xe28093具有「LATIN1」沒有等效

character 0xe28093 of encoding "UTF8" has no equivalent in "LATIN1"

數據正在由一個Grails插入應用。我試過以下沒有成功:在JDBC康涅狄格州串

  • hibernate { connection.characterEncoding='utf8'}
  • ?charSet=LATIN1
  • hibernate { connection.charSet='LATIN1'}

數據庫用創建:

CREATE DATABASE mydb 
    WITH OWNER = postgres 
     ENCODING = 'LATIN1' 
     TABLESPACE = pg_default 
     LC_COLLATE = 'C' 
     LC_CTYPE = 'C' 
     CONNECTION LIMIT = -1; 

任何想法?先謝謝你。

回答

3

這是針對en dash symbol的UTF-8編碼。 latin1字符集中最接近的等效字符將是字符代碼150(0x96)。

+0

謝謝你的鏈接。真的很有用。 – paulosuzart 2012-04-10 00:47:14

4

如果我理解正確,您的數據庫已使用編碼「LATIN1」創建。在創建數據庫後,此編碼無法更改。唯一可以改變的地方就是你的客戶端和PostgreSQL 服務器之間的編碼。 PostgreSQL服務器然後嘗試在客戶端編碼和數據庫編碼之間進行轉換。

如果客戶端傳輸的數據不能轉換成數據庫編碼,這個過程當然會失敗。在你的情況下,Unicode codepoint 2013不能被翻譯成LATIN1。

這意味着您必須清除所有數據到數據庫。擺弄客戶端編碼無濟於事。

+0

謝謝A.H ..請看看創造ddl。我想知道LC_COLLATE或LC_CTYPE是否有助於改變不同的值。 – paulosuzart 2012-04-10 11:40:53

+0

LC_COLLATE用於語言特定的排序,LC_CTYPE用於「什麼碼位是數字,什麼字符,...」 - 所以不會幫助你,因爲編碼是覆蓋所有人的大傘。 – 2012-04-10 19:15:16

+0

@ paulosuzart:哦,在你用LC_COLLATE和LC_CTYPE擺弄之前,先確定它的含義。有很多,有微妙的。 – 2012-04-10 19:16:45