2012-04-09 70 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