如何在Azure PostgreSQL中创建使用en_GB.utf8区域设置的数据库?
解决Azure PostgreSQL创建数据库时Locale与编码不匹配的问题
问题分析
你执行的CREATE DATABASE语句指定en_GB.utf8作为LC_COLLATE和LC_CTYPE,同时使用UTF8编码,报错提示该Locale需要LATIN9编码——这是因为Azure托管的PostgreSQL服务器上,libc提供的en_GB.utf8 locale实际绑定的编码是LATIN9,无法与UTF8兼容。另外pgAdmin GUI仅显示有限Locale选项,是因为GUI只会列出与当前环境编码兼容的可用选项。
解决方案
1. 切换为ICU提供的Locale(推荐)
Azure PostgreSQL灵活服务器默认使用ICU作为Locale提供器,ICU的Locale命名格式为en-GB,且天然支持UTF8编码,修改后的创建语句如下:
CREATE DATABASE my_db WITH OWNER = admin ENCODING = 'UTF8' LC_COLLATE = 'en-GB' LC_CTYPE = 'en-GB' LOCALE_PROVIDER = 'icu' TABLESPACE = pg_default CONNECTION LIMIT = -1 IS_TEMPLATE = False;
2. 验证服务器可用Locale及编码
先查询服务器上en_GB相关Locale的编码兼容性,确认是否存在可搭配UTF8的选项:
SELECT collname, collencoding FROM pg_collation WHERE collname LIKE 'en_GB%';
collencoding为6对应UTF8,若存在此类记录,可尝试去掉LOCALE_PROVIDER = 'libc'参数后重新执行创建语句;- 若结果中
en_GB.utf8对应的collencoding为11(LATIN9),则无法与UTF8混用,需放弃该Locale或改用LATIN9编码(不推荐,UTF8通用性更强)。
3. 关于pgAdmin GUI显示限制
pgAdmin的Locale选项列表由服务器端返回的兼容选项决定,解决编码与Locale的兼容问题后,新创建的数据库在设置排序规则时,对应兼容的Locale会自动显示在GUI中;也可直接通过SQL语句指定Locale,绕过GUI的选项限制。
内容的提问来源于stack exchange,提问作者Tom Wagstaff
相关产品推荐
相关产品推荐

