Chinaunix首页 | 论坛 | 博客
  • 博客访问: 840839
  • 博文数量: 150
  • 博客积分: 5123
  • 博客等级: 大校
  • 技术积分: 1478
  • 用 户 组: 普通用户
  • 注册时间: 2008-11-06 10:03
文章分类

全部博文(150)

文章存档

2011年(2)

2010年(139)

2009年(9)

分类:

2010-04-05 23:22:43

 
当初学者在使用PostgreSQL数据库,输入中文时,会遇到“ERROR:  invalid byte sequence for encoding "UTF8": 0xd6d0”的错误,原因是由于没有正确设置客户端字符集。
 
问题的原因:
默认情况下,PostgreSQL是不转换字符集的,如果你的数据库是UTF8的字符集,一般终端的中文字符集会设置为GBK,或en_US(查看终端的字符集可以看LANG环境变量的设置),所以你输入的中文是GBK的编码,这个编码不经转换的存入数据库中,而数据库是UTF8的,PostgreSQL一看没有这样的UTF8编码,所以当然报错了。
解决方法为:
方法一:设置postgresql的客户端编码为GBK,这时PostgreSQL就知道输入的内容是GBK编码的,这样PostgreSQL数据库会自动做字符集的转换,把其转换成UTF8编码。
方法二:直接设置终端的字符集编码为UTF8,让输入的编码直接为UTF8,而不是GBK。
 
看我具体的演示:
 
方法一:设置postgresql的客户端编码:
设置psql客户端字符集为GBK,方法有两种,一种是在psql中输入“\encoding GBK” ,另一种是设置环境变量“export PGCLIENTENCODING=GBK”,看我的演示:
#psql -d dsc
dsc=# insert into t values(1,'中国');
ERROR:  invalid byte sequence for encoding "UTF8": 0xd6d0
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".
dsc=# show client_encoding;
 client_encoding
-----------------
 UTF8
(1 row)
dsc=# \encoding GBK 
dsc=# show client_encoding;
 client_encoding
-----------------
 GBK
(1 row)
dsc=# insert into t values(1,'中国');
INSERT 0 1
dsc=# commit;
WARNING:  there is no transaction in progress
COMMIT
dsc=# select * from t;
 id | name
----+------
  1 | 中国
(1 row)

[postgres@dsc ~]$ export PGCLIENTENCODING=GBK
[postgres@dsc ~]$ psql
psql: FATAL:  conversion between GBK and LATIN1 is not supported
[postgres@dsc ~]$ psql -d dsc
psql (8.4.3)
Type "help" for help.
dsc=# select * from t;
 id | name
----+------
  1 | 中国
(1 row)
dsc=# insert into t values(2,'我的中国');
INSERT 0 1
dsc=# select * from t;                  
 id |   name  
----+----------
  1 | 中国
  2 | 我的中国
(2 rows)
 
 
方法二:设置终端的编码为UTF8:
 
[postgres@dsc ~]$ export LANG=zh_CN.UTF8
 
然后修改终端软件的字符集编码,我使用的是SecureCRT,修改方法为:
Option->Session Option->外观->字符编码,把那个下拉框的内容改成“UTF8”:
然后再插入数据测试:

[postgres@dsc ~]$ psql -d dsc
psql (8.4.3)
Type "help" for help.
dsc=# select * from t;
 id |   name  
----+----------
  1 | 中国
  2 | 我的中国
(2 rows)
dsc=# insert into t values(3,'我的中国');
INSERT 0 1
dsc=# select * from t;                  
 id |   name  
----+----------
  1 | 中国
  2 | 我的中国
  3 | 我的中国
(3 rows)
 
阅读(38131) | 评论(6) | 转发(0) |
给主人留下些什么吧!~~

汤汤8012015-05-27 11:48:57

汤汤801:为什么我的客户端的编码改成了UTF8改不过来

改过来了退出去 在查看编码的时候又是 GBK

回复 | 举报

汤汤8012015-05-27 11:48:28

为什么我的客户端的编码改成了UTF8改不过来

chinaunix网友2010-12-17 15:50:13

如果有生僻字这个一样也不行,两个方法都不行啊。 如有“寋”这个字的时候,我试了,报错: character 0xfd27 of encoding "GBK" has no equivalent in "UTF8"

chinaunix网友2010-09-30 10:19:26

谢谢呀,找了好久了。。

chinaunix网友2010-05-18 11:53:09

帮你搞定! --假如当前目录下有完整的china.shp文件(应该有三个同名不同扩展名.dbf,.shp,.shx的文件),需要把其 --中数据输入到上述的wen2数据库中的数据表china_postgis中,具体操作为(操作用户为postgres): --1.把shp转换成sql -- 命令 shp文件 要生成的表名 生成的建立表的sql --$bin>shp2pgsql china china_postgis > tmp.sql --2.生成指定srid的sql -- 命令 指定srid shp文件 要生成的表名 生成的建立表的sql --$bin>shp2pgsql -s 4326 -w "GBK" china.shp china_postgis > tmp.sql --3.用sql生成空间数据表,执行完后会创建china_postgis表,并且会自动地给geometry_columns增加一行数据,维护这个表的信息 -- 命令 用户 数据库 脚本文件