中文环境下PostgreSQL的使用

虽然官方文档有提到编码的问题,但是对于中文讲的比较简单,给中文的PostgreSQL用户带来很多困扰,本文简单简述一下中文环境下PostgreSQL如何正确设置编码。

一、服务器端的编码设置

PostgreSQL在服务器端只支持两种简体中文编码: EUC_CN和UTF-8,而由于windows不支持EUC所以,在windows环境底下只能选UTF-8。

1. 安装时的编码设置

1.1 Linux下的中文编码设置

设置为EUC_CN
[localhost ~]$ initdb -E EUC_CN -D data7 --locale=zh_CN

设置为UTF-8
[galy@localhost ~]$ initdb -E UTF-8 -D data7 --locale=zh_CN.UTF-8

1.2 Windows下的中文编码设置

设置为UTF-8
initdb.exe -E UTF8  -D c:\data3  --locale=chinese

2. 常见的问题:

2.1 不支持的服务器编码

如果环境的默认编码是PostgreSQL不支持的话,初始化的时候会报错,如下面环境的中文编码为GBK,而PG不支持GBK,所以报错。
[localhost ~]$ export LANG=zh_CN.gbk
[localhost ~]$ initdb -D testencoding

The database cluster will be initialized with locale zh_CN.gbk.
initdb: locale zh_CN.gbk requires unsupported encoding GBK
Encoding GBK is not allowed as a server-side encoding.
Rerun initdb with a different locale selection.

2.2 locale和编码有冲突

如果指定的locale和编码格式有冲突,同样也会报错。解决的方便是,指定编码兼容的locale.

[localhost ~]$ locale
LANG=zh_CN.gbk
LC_CTYPE="zh_CN.gbk"

默认的locale是中文gbk, 而下面的编码确实EUC_CN,因而系统报错,解决的方法是,指定--locale=zh_CN

[localhost ~]$ initdb -E EUC_CN -D data6
The files belonging to this database system will be owned by user "galy".
This user must also own the server process.

The database cluster will be initialized with locale zh_CN.gbk.
initdb: encoding mismatch
The encoding you selected (EUC_CN) and the encoding that the
selected locale uses (GBK) do not match.  This would lead to
misbehavior in various character string processing functions.
Rerun initdb and either do not specify an encoding explicitly,
or choose a matching combination.

initdb: 警告: 编码不匹配
您选择的编码 (EUC_CN) 和所选择的语言环境使用的编码 (GBK) 不匹配的.
这样将导致处理不同字符串的函数时产生错误.
要修复此问题, 重新运行 initdb 并且不要明确指定编码, 或者先选择一个匹配
组合类型.

二、客户端的编码

虽然PG支持客户端和服务器端的编码自动转换,但是还需要遵从一个原则:本地环境的编码和客户端编码需一致。否则将会出现乱码或者是其他问题。

本地环境的编码为GBK
C:\Program Files\PostgreSQL\9.1\bin>chcp
活动代码页: 936

数据库的编码为UTF8
=#\t
Name              | lenovo
Owner             | lenovo
Encoding          | UTF8
Collate           | Chinese (Simplified)_People's Republic of China.936
Ctype             | Chinese (Simplified)_People's Republic of China.936
Access privileges |

客户端编码为GBK
lenovo=# \encoding
GBK

现在本地环境和客户端编码都是GBK,所以没有问题
客户端输入的GBK字符,会自动转化为UTF-8
lenovo=# insert into test values('测试');
INSERT 0 1

服务器端的UTF-8编码,传到客户端时候,也会自动转换编码为GBK:
lenovo=# select * from test;
 name
------
 测试
(1 row)

如果客户端设置为UTF-8的话,和本地环境的GBK不一致则会出现问题
lenovo=# \encoding UTF-8

由于客户端编码和服务器端一致,为UTF-8,所以不转换传到客户端,而操作系统把它当作GBK显示,所以显示乱码:
lenovo=# select * from test;
 name
------
 娴嬭瘯
(1 row)

而插入的字符则直接以GBK编码的形式传到服务器端,服务器端认识不了,所以报错。
lenovo=# insert into test values('测试');
ERROR:  invalid byte sequence for encoding "UTF8": 0xb2
ERROR:  invalid byte sequence for encoding "UTF8": 0xb2

输入和显示都有问题,这是因为如果客户端和服务器的编码都一致的话,则不进行转码,而输入是按照本地环境的GBK进行编码,GBK的编码进入UTF-8的库当然会有问题。

三、显示信息的中文话

PostgreSQL支持多语言显示提示信息,如果希望服务器端及客户端的提示信息为中文,还需要进行一些额外的设置。

首先, 编译的时候需要加上自然语言支持模块

./configure --enable-nls

其次,在参数配置文件postgresql.conf设置信息为中文

lc_messages = 'zh_CN'                     # locale for system error message

这样在服务器端和客户端的提示信息都显示为中文

[localhost ~]$
日志:  已启动autovacuum
日志:  数据库系统准备接受连接

# dsd;
错误:  语法错误 在 "dsd" 或附近的 第 1 个字符处
语句:  dsd;
错误:  语法错误 在 "dsd" 或附近的。

时间: 2024-08-08 07:15:47

中文环境下PostgreSQL的使用的相关文章

Red Flag Asianux Server 3用户指南:在中文环境下工作

Red Flag Asianux Server 3全新引入具有国际化语言支持能力的 SCIM输入框架,除全面支持http://www.aliyun.com/zixun/aggregation/30825.html">国家标准 GB18030外,还为用户提供了繁体中文.日文.韩文同时显示及输入功能,并能够更为完整地适用中文显示.中文输入和中文打印解决方案. 中文显示方面,实现了对矢量字体( TrueType)的平滑化,使得中文字体美观实用: 提供了多种国际上流行.易用的输入法,极大地方便了用

Red Flag Linux Desktop 6.0用户手册:在中文环境下工作

系统默认使用 SCIM输入法,Red Flag Linux http://www.aliyun.com/zixun/aggregation/16493.html">Desktop 6.0引入具有国际化语言支持能力的 SCIM输入框架并能够提供更为完整.适用的中文显示.输入和打印的解决方案. 中文显示方面,实现了对矢量字体(TrueType)的平滑化,使得中文字体更加美观实用: 提供了多种国际上流行.易用的输入法,极大地方便了用户的使用: 提供了输入法管理器,用户可以灵活地创建和定制自己喜爱

中文环境下acroread不能正常打开文件的解决方法

第一种解决方法: 注意:如果SCIM正在运行,http://www.aliyun.com/zixun/aggregation/9084.html">Adobe Reader 7.0将不能运行.(如果我们装了中文,SCIM就会运行.)要绕过此问题,做如下操作: sudo gedit /usr/bin/acroread(或者sudo vim /usr/bin/acroread) 把如下部分 #!/bin/sh # 改变成: #!/bin/sh # GTK_IM_MODULE=xim 保存文件.

Linux环境下"Font font = new Font("黑体", Font.BOLD, 18)"[BufferedImage~Graphics~drawString]中文乱码

Linux环境下"Font font = new Font("黑体", Font.BOLD, 18)"[BufferedImage~Graphics~drawString]中文乱码,windows下不会乱码,但在linux下nginx和tomcat部署后出现乱码.方框.问号等等,不能认清楚!!! 先说说系统: Microsoft Windows [版本 10.0.10586] (c) 2015 Microsoft Corporation.保留所有权利. ------

utf-8-在linux环境下,用vim写.py脚本时,print中文

问题描述 在linux环境下,用vim写.py脚本时,print中文 我在linux环境下,用vim写.py脚本时,print中文时,运行不成功,查了查网友说要加# -*- coding:utf-8 -*-,但不是说#后的无效吗 ?这是什么意思呢 解决方案 一些解释器,使用注释来添加私有的功能 这样的好处是,这些功能是非标准的,因为写在注释里面,用不兼容的解释器执行,直接忽略掉,而不会丢出错误来.保证了兼容性的同时,实现了额外的功能扩展. 很多语言都用了类似的技术,比如ie浏览器解释html有自

Windows环境下Tomcat启动窗口标题中文乱码

问题描述 Windows环境下Tomcat启动窗口标题中文乱码 在windows环境下,如果生产环境一台机子上多个tomcat部署多个系统,tomcat全部启动后不知道是哪个具体系统的控制台,通过修改了catalina.bat里的title的默认Tomact标题为系统名称,如果为中文就乱码,点击startup.bat启动tomcat的窗口标题栏修改为中文乱码,求高手解决

PHP用mb_string函数库处理与windows相关中文字符及Win环境下开启PHP Mb_String方法_php实例

PHP用mb_string函数库处理与windows相关中文字符 昨天想批处理以前下载的一堆文件,把文件里的关键内容用正则匹配出来,集中处理.在操作文件时遇到一个问题,就是windows操作系统中的编码问题. 我们都知道windows中(当然是中文版),文件名和文件内容等编码都是gbk,而我们在开发过程中,IDE里的编码则是UTF-8,(这里不讨论为什么等等问题, 只考虑怎么把编码转变成一样的)所以导致我写的UTF-8编码的正则模式字符串中的中文在gbk编码的文件中并不能正确匹配. 一开始,我并

linux环境下php读取csv文件中文读取不到的问题解决办法

在LIUNX环境下PHP读取csv文件的时候,csv文件中的中文不显示.... 终于找到了解决方案,下面和大家分享下! 在执行csv文件读取前加上一句: setlocale(LC_ALL, 'zh_CN'); 瞬间,问题解决了.... 实例: <?phpsetlocale(LC_ALL, 'zh_CN');$handle = fopen("xxx.csv","r");while ($data = fgetcsv($handle, 1000,',')) { ..

Windows环境下MySQL5.7中文显示乱码的三种解决方案

最近在将数据从Oracle迁移到MySQL的过程中,遇到一些问题,其中就包括中文字符显示乱码. 数据导入成功之后,中文字段内容无法正常显示.后来才发现客户端的字符集设置是对的,服务器端的字符集设置不支持中文字符. 后来经过测试发现,我们可以通过三种方法解决这个问题,按照从低到高的级别分别是: 表级 数据库级 服务器级 1.测试环境 Windows Server 2008 r2+MySQL Community Server (GPL) 5.7.16  我是在Windows Server 2008