初学者遇到的PostgreSQL字符集问题的解决

当初学者在使用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)

时间: 2024-10-30 08:22:42

初学者遇到的PostgreSQL字符集问题的解决的相关文章

乱码-postgresql字符集编码如何修改成utf_8??

问题描述 postgresql字符集编码如何修改成utf_8?? 2C 如题所说,现在我在JAVA插入一条语句,在数据库查询却变成了中文乱码,希望有人能够帮忙解决,谢谢! 解决方案 oracle 修改数据库的字符集编码为UTF-8oracle 修改数据库的字符集编码为UTF-8ORACLE修改数据库的字符集编码为UTF-8方法 解决方案二: http://blog.csdn.net/beiigang/article/details/7051605

postgresql数据库-postgresql字符集问题

问题描述 postgresql字符集问题 win7系统新装了个PostgreSql,通过vb.net也成功与数据库交互了,但是数据库中的中文部分,在客户端拿到的是乱码. 客户端inset的字段中有中文会提示错误:22021. 应该是字符集问题. 请问: 1.是否应该在客户端控制与数据库交互时的编码呢?如何控制? 2.是否应该修改数据库的编码格式?如何修改? 另外,sql?shell怎么用啊? 怎么我输入sql指令没有输出结果啊? 比如?select?*?from?user_info 解决方案 p

Oracle数据库移植时字符集问题的解决

对于Oracle数据库之间的移植采用Oracle的导入导出工具(Import/Export)是一个比较好的策略.虽也可以利用第三方软件如Sybase 的Power designer中的Reverse Engineering 进行数据库结构重建,然后在进行较复杂的数据导入过程,但对于作业队列.快照等则不得不用手工来创建.而Export能将整个数据库.指定用户.指定表和相关的数据字典进行输出,Export输出的输出转存二进制文件包括了完全重建所有被选对象所需的命令. 本人在为某电厂MIS(Oracl

我初学者,想找个师父帮忙解决自学过程的问题

问题描述 我是大一新生,学完了C,现在学习java,想找个师父或者可以一起学习的.有愿意的留下联系方式.联系你 解决方案 解决方案二:有问题来这问就好了大家会帮你解决的啊解决方案三:你把你的QQ留下吧,解决方案四:我现在在写计算器的代码,在处理运算的时候不清楚算法..求仔细讲解(注:老师,刘发久,曾任大连理工信息系主任,好像挺厉害的.有没有他的学生看到~~)解决方案五:该回复于2011-03-23 14:15:19被版主删除解决方案六:才大一啊,好羡慕啊,年轻真好!解决方案七:呵呵,你也年轻过啊

mysql5中遇到的字符集问题以及解决办法

今天打开slave日志发现一堆错误全部是这种: [ERROR] Slave: Error 'Character set '#28' is not a compiled character set and is not specified in the '/usr/local/mysql/share/mysql/charsets/Index.xml' file' on query. 我在master(linux)机上写insert语句,发现同步是没问题的,后来我在window上用一个mysql客户

mysql5中遇到的字符集问题及解决办法

今天打开slave日志发现一堆错误全部是这种: [ERROR] Slave: Error 'Character set '#28' is not a compiled character set and is not specified in the '/usr/local/mysql/share/mysql/charsets/Index.xml' file' on query. 我在master(linux)机上写insert语句,发现同步是没问题的,后来我在window上用一个mysql客户

实例讲解MySQL字符集出错的解决方法

错误如下: Illegal mix of collations (gbk_chinese_ci,IMPLICIT) and (gbk_bin,IMPLICIT) for operation '=', SQL State: HY000, Error Code: 1267 错误原因: 数据库的编码与建表时的编码不一样; 处理方法: 如果安装MySQL时设置的编码为jbk,那么在建表时可以如下处理: CREATE TABLE `teachers` ( `id` int(11) NOT NULL def

PostgreSQL服务器管理:本地化

本文档为PostgreSQL 9.6.0文档,本转载已得到原译者彭煜玮授权. 1. 区域支持 区域支持指的是应用遵守文化偏好的问题,包括字母表.排序.数字格式等.PostgreSQL使用服务器操作系统提供的标准 ISO C 和POSIX的区域机制.更多的信息请参考你的系统的文档. 1.1. 概述 区域支持是在使用initdb创建一个数据库集簇时自动被初始化的.默认情况下,initdb将会按照它的执行环境的区域设置初始化数据库集簇: 因此如果你的系统已经设置为你的数据库集簇想要使用的区域, 那么你

如何在LINUX中修改文件字符集

有些情况下,我们需要修改文件的字符集,以便解决乱码或者其他问题.在linux下,操作系统为我们提供了ICONV这个命令,下面我们来看一下这个命令的具体使用方法. [root@oadata ~]# iconv --help 用法: iconv [选项...] [文件...] 转换给定文件的编码. 输入/输出格式规范: -f, --from-code=名称 原始文本编码 -t, --to-code=名称 输出编码 信息: -l, --list 列举所有已知的字符集 输出控制: -c 从输出中忽略无效