今天想创建一个指定字符集的数据库,结果出现了如下的情况:
postgres=# create database testdb01 encoding 'latin1' template template0;
ERROR: encoding "LATIN1" does not match locale "zh_CN.UTF-8"
DETAIL: The chosen LC_CTYPE setting requires encoding "UTF8".
嗯? 这个 LC_CTYPE 是个啥?
查了一下,原来是这么回事:
LC_CTYPE是地域信息locale的一部分,locale是根据计算机用户所使用的语言,所在国家或者地区,以及当地的文化传统所定义的一个软件运行时的语言环境。
包含以下的信息
1、语言符号及其分类(LC_CTYPE)
2、数字(LC_NUMERIC)
3、比较和排序习惯(LC_COLLATE)
4、时间显示格式(LC_TIME)
5、货币单位(LC_MONETARY)
6、信息主要是提示信息,错误信息,状态信息,标题,标签,按钮和菜单等(LC_MESSAGES)
7、姓名书写方式(LC_NAME)
8、地址书写方式(LC_ADDRESS)
9、电话号码书写方式(LC_TELEPHONE)
10、度量衡表达方式 (LC_MEASUREMENT)
11、默认纸张尺寸大小(LC_PAPER)
12、对locale自身包含信息的概述(LC_IDENTIFICATION)。
操作系统中,可以通过命令locale查看:
locale
LANG=zh_CN.UTF-8
LANGUAGE=zh_CN
LC_CTYPE="zh_CN.UTF-8"
LC_NUMERIC="zh_CN.UTF-8"
LC_TIME="zh_CN.UTF-8"
LC_COLLATE="zh_CN.UTF-8"
LC_MONETARY="zh_CN.UTF-8"
LC_MESSAGES="zh_CN.UTF-8"
LC_PAPER="zh_CN.UTF-8"
LC_NAME="zh_CN.UTF-8"
LC_ADDRESS="zh_CN.UTF-8"
LC_TELEPHONE="zh_CN.UTF-8"
LC_MEASUREMENT="zh_CN.UTF-8"
LC_IDENTIFICATION="zh_CN.UTF-8"
LC_ALL=
数据库中,也可以设定数据库运行时的地域信息,可以通过以下参数在数据库初始化指定(initdb)
--lc-collate=locale
--lc-ctype=locale
--lc-messages=locale
--lc-monetary=locale
--lc-numeric=locale
--lc-time=locale
其中, LC_CTYPE、 LC_COLLATE也可以在数据库创建时指定:
postgres=# create database testdb01 LC_COLLATE='zh_CN.UTF-8' LC_CTYPE='zh_CN.UTF-8' encoding 'utf8';
CREATE DATABASE
PG数据库支持的字符集和 LC_CTYPE、 LC_COLLATE可以参考 http://www.postgres.cn/docs/11/multibyte.html
C语言中可以使用函数setlocale来设定。