PostgreSQL 12中upper()无法正确转换重音字符为大写的解决咨询
解决PostgreSQL 12中西语重音字符upper()转换异常的问题
问题根源在于你使用的united_states.utf8(即en_US.utf8)排序规则是针对美式英语设计的,对西班牙语重音字符的大小写转换逻辑不匹配。以下是具体解决方法:
临时快速解决:调用upper时指定西班牙语排序规则
直接在upper函数中指定西班牙语的collation,即可正确转换重音字符:upper('anuncio genérico para web del cliente' COLLATE "es_ES.utf8");执行后会得到预期结果:
'ANUNCIO GENÉRICO PARA WEB DEL CLIENTE'。先确认系统是否支持西班牙语排序规则
先检查PostgreSQL中是否存在西班牙语的collation,执行:SELECT name FROM pg_collation WHERE name LIKE '%es_%';如果结果里有
es_ES.utf8这类条目,说明可以直接使用上述方法;如果没有,需要先在操作系统层面安装西班牙语locale:- Debian/Ubuntu系统:
sudo locale-gen es_ES.UTF-8 sudo update-locale sudo systemctl restart postgresql - RHEL/CentOS系统:
sudo localedef -i es_ES -f UTF-8 es_ES.UTF-8 sudo systemctl restart postgresql
重启服务后再次执行pg_collation查询,就能看到对应的排序规则了。
- Debian/Ubuntu系统:
永久解决:修改列的排序规则
如果不想每次调用upper都手动指定collate,可以直接修改存储西语文本的列的排序规则:ALTER TABLE your_table ALTER COLUMN your_column TYPE text COLLATE "es_ES.utf8";之后对该列调用upper()时,会自动用西班牙语规则处理重音字符的大小写转换。
内容的提问来源于stack exchange,提问作者A Smith
相关产品推荐
相关产品推荐

