因此,我几乎没有使用PostgreSQL的Debian服务器。从历史上看,这些服务器和PostgreSQL是使用Latin 9字符集进行本地化的,那时还不错。现在,我们必须处理波兰语,希腊语或中文这样的问题,因此对其进行更改已成为一个日益严重的问题。
当我尝试创建UTF8数据库时,收到消息:
错误:编码UTF8与语言环境fr_FR不匹配详细信息:所选的LC_CTYPE设置需要编码LATIN9。
很少有几次我和我的老朋友Google进行过相关的研究,而我发现的过程过于复杂,例如更新Debian LANG
,使用正确的字符集重新编译PostgreSQL,编辑所有LC_
系统变量和其他晦涩的解决方案。所以暂时,我们将这个问题搁置一旁。
最近,它又回来了,希腊人想要的东西,而拉丁9人不想。当我再次调查这个问题时,一位同事走近我说:“不,很简单,看。”
他没有编辑任何内容,没有做魔术,他只是执行以下SQL查询:
CREATE DATABASE my_utf8_db
WITH ENCODING='UTF8'
OWNER=admin
TEMPLATE=template0
LC_COLLATE='C'
LC_CTYPE='C'
CONNECTION LIMIT=-1
TABLESPACE=pg_default;
而且效果很好。
我实际上一无所知LC_CTYPE='C'
,我很惊讶没有在Google的第一个解决方案上甚至在Stack Overflow上都没有使用它。我环顾四周,只在PostgreSQL文档中找到一个提及。
当LC_CTYPE为C或POSIX时,允许使用任何字符集,但是对于LC_CTYPE的其他设置,只有一个字符集可以正常工作。由于initdb冻结了LC_CTYPE设置,因此在集群的不同数据库中使用不同编码的明显灵活性要比实际更具理论性,除非您选择C或POSIX语言环境(从而禁用任何实际语言环境感知)。
因此,让我感到奇怪的是,这太容易了,太完美了,缺点是什么?而且,我很难找到答案。所以我在这里发布:
tl; dr:在特定的本地化环境中使用的缺点是什么LC_CTYPE='C'
?这样做不好吗?我应该打破什么?