PostgreSQL在劳动器端只扶持二种简体中文编码,不

2019-11-26 17:14栏目:网络数据
TAG:

今天在整理资料的时候发现,Postgre出现了解压缩直接使用的版本,上边注明了for expert only. 呵呵,看来,不推荐生手使用。 为了试验一把,索性从它的官网上直接下载了一份postgresql-8.3.3-1-binaries-no-installer.zip

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

#chown -Rf postgres:postgres pgsql

  1. 将其解压到d:pgsql8.3.3 2. 设置环境变量,我不想直接添加,而是写到了一个batch文件里,名为pgenv.bat set PGHOME=d:pgsql8.3.3 set PATH=%PGHOME%bin;%path% set PGHOST=localhost set PGLIB=%PGHOME%lib set PGDATA=%PGHOME%data 3. 执行 pgenv.bat 然后: D:pgsql8.3.3bin>initdb 属于此数据库系统的文件宿主为用户 "******". 此用户也必须为服务器进程的宿主. 数据库簇将带有 locale Chinese_People's Republic of China.936 初始化. initdb: locale Chinese_People's Republic of China.936 requires unsupported encod ing GBK Encoding GBK is not allowed as a server-side encoding. Rerun initdb with a different locale selection. 这上边的意思好像是说不直接支持cp936, GBK,晕。于是,强制执行: D:pgsql8.3.3bin>initdb --locale=zh_CN initdb: 无效的 locale 名字 "zh_CN" initdb: 无效的 locale 名字 "zh_CN" initdb: 无效的 locale 名字 "zh_CN" initdb: 无效的 locale 名字 "zh_CN" initdb: 无效的 locale 名字 "zh_CN" initdb: 无效的 locale 名字 "zh_CN" 属于此数据库系统的文件宿主为用户 "hex". 此用户也必须为服务器进程的宿主. 数据库簇将带有 locale Chinese_People's Republic of China.936 初始化. initdb: locale Chinese_People's Republic of China.936 requires unsupported encod ing GBK Encoding GBK is not allowed as a server-side encoding. Rerun initdb with a different locale selection. 还是不行,再换成下边的: D:pgsql8.3.3bin>initdb --locale=C 属于此数据库系统的文件宿主为用户 "hex". 此用户也必须为服务器进程的宿主. 数据库簇将带有 locale C 初始化. 默认的数据库编码已经相应的设置为 SQL_ASCII. The default text search configuration will be set to "english". 创建目录 d:/pgsql8.3.3/data ... 成功 creating subdirectories ... 成功 选择默认最大联接数 ... 100 selecting default shared_buffers/max_fsm_pages ... 32MB/204800 创建配置文件 ... 成功 在 d:/pgsql8.3.3/data/base/1 中创建 template1 数据库 ... 成功 initializing pg_authid ... 成功 initializing dependencies ... 成功 创建系统视图 ... 成功 loading system objects' descriptions ... 成功 创建字符集转换 ... 成功 creating dictionaries ... 成功 对内建对象设置权限 ... 成功 创建信息模式 ... 成功 清理数据库 template1 ... 成功 拷贝 template1 到 template0 ... 成功 copying template1 to postgres ... 成功 警告: 为本地连接启动了 "trust" 认证. 你可以通过编辑 pg_hba.conf 更改或你下 次运行 initdb 时使用 -A 选项. Success. You can now start the database server using: "postgres" -D "d:/pgsql8.3.3/data" or "pg_ctl" -D "d:/pgsql8.3.3/data" -l logfile start 12下一页阅读全文

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.

[root@tse4-odoo data]# 

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

 

 name

 测试
(1 row)

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

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

#source /etc/bashrc

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

creating directory /usr/local/pgsql/data ... ok

2.2 locale和编码有冲突

做initdb

本地环境的编码为GBK
C:Program FilesPostgreSQL9.1bin>chcp
活动代码页: 936

export MANPATH=$MANPATH:$POSTGRES_HOME/share/man

一、服务器端的编码设置

 

1.1 Linux下的中文编码设置

Success. You can now start the database server using:

  1. 常见的问题:

  #tar zxvf postgresql-9.4.14.tar.gz 

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

export PGDATA=$POSTGRES_HOME/data

 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" 或附近的。

export PGLIB=$POSTGRES_HOME/lib

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

setting privileges on built-in objects ... ok

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

编辑内容到最后

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

 

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

--auth-local and --auth-host, the next time you run initdb.

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

#vi /home/postgres/.bashrc 

2.1 不支持的服务器编码

initdb: could not find suitable text search configuration for locale "zh_CN.UTF-8"

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

[postgres@tse4-odoo ~]$ initdb -D /usr/local/pgsql/data

  1. 安装时的编码设置

#vi /etc/bashrc

1.2 Windows下的中文编码设置

#passwd postgres

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

  #cd postgresql-9.4.14

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

creating dictionaries ... ok

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

creating collations ... ok

数据库的编码为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 |

Starting PostgreSQL: ok

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

creating template1 database in /usr/local/pgsql/data/base/1 ... ok

[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.

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.

[root@tse4-odoo init.d]# chkconfig postgresql-9.4.15 on

二、客户端的编码

selecting dynamic shared memory implementation ... posix

#cd /usr/local/src/

The default text search configuration will be set to "simple".

[root@tse4-odoo init.d]# chkconfig --add postgresql-9.4.15

 

    pg_ctl -D /usr/local/pgsql/data -l logfile start

  #ls

copying template1 to template0 ... ok

syncing data to disk ... ok

WARNING: enabling "trust" authentication for local connections

  #./configure --with-openssl

[root@tse4-odoo data]# service postgresql-9.4.15 start

[root@tse4-odoo pgsql]# su - postgres

#useradd postgres

The database cluster will be initialized with locale "zh_CN.UTF-8".

creating configuration files ... ok

selecting default max_connections ... 100

 

loading PL/pgSQL server-side language ... ok

copying template1 to postgres ... ok

export POSTGRES_HOME=/usr/local/pgsql

保存到/usr/local/src下  

 

[root@tse4-odoo data]# service postgresql-9.4.15 restart

loading system objects' descriptions ... ok

PATH=$PATH:/usr/local/pgsql/bin

 

Data page checksums are disabled.

1.下载

# cp /usr/local/src/postgresql-9.4.15/contrib/start-scripts/linux postgresql-9.4.15

The default database encoding has accordingly been set to "UTF8".

You can change this by editing pg_hba.conf or using the option -A, or

 

creating system views ... ok

 

creating subdirectories ... ok

vacuuming database template1 ... ok

creating information schema ... ok

    postgres -D /usr/local/pgsql/data

#source /home/postgres/.bashrc 

or

  #make install

  #make

[root@tse4-odoo init.d]# chmod +x postgresql-9.4.15 

creating conversions ... ok

 

export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:$PGLIB

# cd /etc/rc.d/init.d/

initializing pg_authid ... ok

initializing dependencies ... ok

selecting default shared_buffers ... 128MB

编辑内容到最后

The files belonging to this database system will be owned by user "postgres".

Restarting PostgreSQL: ok

版权声明:本文由大奖888-www.88pt88.com-大奖888官网登录发布于网络数据,转载请注明出处:PostgreSQL在劳动器端只扶持二种简体中文编码,不