KingbaseES Collate排序规则对结果集的影响
背景
前端在客户现场遇到一个问题,模糊查询报错:error:invalid multibyte charactor for locale pg the server LC_TYPE locale is probably incompatible with the database encoding
经查询现场环境:server_encoding,client_encoding,操作系统字符集,终端工具字符集均为zh_CN.GBK
查询语句为:select ..from ...where t_name like '国家%';
分析
通过\l+查看对应数据库的 Collate为ci_x_icu , Ctype为zh_CN.GBK。
根据报错提示,我们有理由可看出ci_x_icu排序规则阻止了中文字符排序的输出。因为查到的操作系统命令locale查出本地语言环境变量 LC_COLLATE,LC_CTYPE均为zh_CN.GBK
这时候解决方法是
1,在sql语句后面附加上排序规则,例如:
select ..from ...where t_name like '国家%' collate "zh_CN.GBK";
2,新建数据库初始化排序规则,然后将原表导入,经测试不再报错:
create database test encoding 'zh_CN.GBK' lc_collate 'zh_CN.GBK' lc_ctype 'zh_CN.GBK' template template0;
具体选择哪种方式根据业务是否多变性灵活选择。
关于排序规则(Collation)
[
](javascript:void(0)
LC_COLLATE String sort order
LC_CTYPE 字符分类
LC_MESSAGES 消息的语言
LC_MONETARY 货币使用的格式
LC_NUMERIC 数字使用的格式
LC_TIME 时间日期使用的格式
[
](javascript:void(0)
查询字符集支持的LC_COLLATE和LC_CTYPE信息
test=> select pg_encoding_to_char(collencoding) as encoding,collname,collcollate,collctype from pg_collation ;
返回结果如下所示,encoding为空时,表示这个collation支持所有的字符集。
[
](javascript:void(0)
encoding | collname | collcollate | collctype
------------+-----------------------+-----------------------+-----------------------
| default | |
| C | C | C
| POSIX | POSIX | POSIX
UTF8 | aa_DJ | aa_DJ.utf8 | aa_DJ.utf8
LATIN1 | aa_DJ | aa_DJ | aa_DJ
LATIN1 | aa_DJ.iso88591 | aa_DJ.iso88591 | aa_DJ.iso88591
UTF8 | aa_DJ.utf8 | aa_DJ.utf8 | aa_DJ.utf8
UTF8 | aa_ER | aa_ER | aa_ER
UTF8 | aa_ER.utf8 | aa_ER.utf8 | aa_ER.utf8
.......
EUC_CN | zh_CN | zh_CN | zh_CN
UTF8 | zh_CN | zh_CN.utf8 | zh_CN.utf8
[
](javascript:void(0)
设置数据库的本土化(collate)信息
1,设置字段的本土化
执行如下SQL命令,查询当前数据库的字符集,并了解清楚与您当前数据库字符集兼容的collate。
postgres=# select datname,pg_encoding_to_char(encoding) as encoding from pg_database;
操作步骤:
可以在创建表时指定当前字符集兼容的collate:
CREATE TABLE test1 (
a text COLLATE "zh_CN.GBK",
b text COLLATE "ci_x_icu",
...
);
也可以修改列collate:
注意:修改列collate时,会导致rewrite table,大表请谨慎操作。会耗时很久。
alter table a alter c type text COLLATE "en_US";
2,在SQL使用本土化
如上文提到的方法:
test=# select * from a order by c collate "C";
3,使用本土化索引进行排序
排序语句中的collate与索引的collate保持一致,才能使用这个索引进行排序。命令如下:
create index idxa on a(c collate "en_US");
explain select * from a order by c collate "en_US";
总结
可以通过如下四种方法来设置按拼音排序:四种方法以上均已提供。
1,使用本土化 SQL。该方法不修改原有数据。
2,使用本土化字段。若已有数据,使用该方法时需要调整原有数据。
3,使用本土化索引以及本土化 SQL。该方法不修改原有数据。
4,将数据库的collate设置为en_US,数据会将默认使用这个collate按拼音排序。
KingbaseES Collate排序规则对结果集的影响的更多相关文章
- 2021-2-18:请你说说MySQL的字符集与排序规则对开发有哪些影响?
任何计算机存储数据,都需要字符集,因为计算机存储的数据其实都是二进制编码,将一个个字符,映射到对应的二进制编码的这个映射就是字符编码(字符集).这些字符如何排序呢?决定字符排序的规则就是排序规则. 查 ...
- SQL:无法解决 equal to 操作的排序规则冲突。
更改存储过程的时候,在SQL中出现了 “无法解决 equal to 操作的排序规则冲突”错误,网上搜之,发现是表之间元素创建时排序规则不同(一个是collate Chinese_PRC_CI_AI_W ...
- SQL无法解决 equal to 运算中 "Chinese_PRC_CI_AS" 和 "SQL_Latin1_General_CP1_CI_AS" 之间的排序规则冲突
在所在的SQL语句后面加上 COLLATE [排序规则]或者ALTER DATABASE [DBName] COLLATE Chinese_PRC_CI_AS
- SQL Server排序规则不一致 - Collate Database_Default
http://www.cnblogs.com/chencidi/archive/2014/07/02/3820386.html 使用多库查询时会出现排序规则冲突的问题 解决办法 在字段后面添加Coll ...
- 数据库排序规则的冲突(理解collate Chinese_PRC_CI_AS)
之前碰到了数据库排序规则冲突问题,即百度或者 Google 的老话题: “ 无法解决 equal to 操作中‘ sql_latin1_general_cp1_ci_as ’和‘ chinese_pr ...
- Mysql中的排序规则utf8_unicode_ci、utf8_general_ci总结
Mysql中utf8_general_ci与utf8_unicode_ci有什么区别呢?在编程语言中,通常用unicode对中文字符做处理,防止出现乱码,那么在MySQL里,为什么大家都使用utf8_ ...
- From 百度知道 SQLSERVER 字符集排序规则简单说明
https://zhidao.baidu.com/question/390314825002277485.html 学习一下, 以后说不定用得到. collate Latin1_General_CS_ ...
- mysql字符集和校对规则(Mysql校对集)
字符集的概念大家都清楚,校对规则很多人不了解,一般数据库开发中也用不到这个概念,mysql在这方便貌似很先进,大概介绍一下简要说明 字符集和校对规则 字符集是一套符号和编码.校对规则是在字符集内用于比 ...
- 全库修改SQL Server现有排序规则
近日,在项目Debug过程中发现了SQL Server排序规则冲突的问题. 由于原数据库是从英文环境的SQL中生成的,其排序规则为“SQL_Latin1_General_CP1_CI_AS”,备份到本 ...
- MySQL字符集与排序规则总结
字符集与排序规则概念 在数据库当中都有字符集和排序规则的概念, 很多开发人员甚至包括有些DBA都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...
随机推荐
- C++ std::move 的一些问题
看 SO 上有一个比较奇怪的问题, When does an rvalue reference result in a move vs copy constructor and why? 问题代码: ...
- win32-UI Automation
使用UI Automation遍历窗口的所有控件标题和类 #include <Windows.h> #include <stdio.h> #include <UIAuto ...
- SVN培训笔记(下拉项目、同步修改、添加文件、修改文件、删除文件、改名文件等)
前言 为了方便新加入团队的员工熟悉团队协作开发. 为了将好东西整理分享给有需要的网友. 将SVN内部员工培训文档公开,以方便更多的人,提高知识获取速度,尽快熟悉协同开发. 本文档培训员工对于 ...
- React 组件通信方式
人生的游戏不在于拿了一副好牌,而在于怎样去打好坏牌,世上没有常胜将军,勇于超越自我者才能得到最后的奖杯. 1. 父子组件通信方式 1.1 父组件传递到子组件 直接通过属性进行传递,数据的传递可以提高组 ...
- Django之第三方平台QQ授权登录的实现
接入指南:https://wiki.connect.qq.com/成为开发者 准备工作 成为开发者 首先要有一个开发者账号,https://connect.qq.com/ 登录后点击用户头像,修改个人 ...
- Java是解释型语言么
基础概念 JVM虚拟机会将.java类文件编译成.class文件--字节码文件,这大家都知道. 代码运行时还需要将.class字节码文件翻译成机器码才能执行. 解释执行:将编译好的字节码一行一行地翻译 ...
- 监控系统open-falcon安装部署
目录 官方文档 安装包下载地址 环境准备 安装redis 安装mysql 安装git 安装GO 安装后台 部署前端: 邮件报警 修改ALARM配置 修改报警接口 报警测试邮件展示 Q&A 官方 ...
- 青少年CTF训练平台-web部分随笔
文章管理系统 首先打开环境(>ω<。人)ZZz♪♪ 既然要做题,就要做全面了,图上说了,既然有假flag我就先找出来: 假flag: 打开vmware,使用sqlmap进行处理: sqlm ...
- Find The Multiple 题解
Find The Multiple The long-lost Sunday is coming again, and the ACM Laboratory Elimination Competi ...
- 一款开源、免费、跨平台的Redis可视化管理工具
前言 经常有小伙伴在技术群里问:有什么好用的Redis可视化管理工具推荐的吗?, 今天大姚给大家分享一款我一直在用的开源.免费(MIT License).跨平台的Redis可视化管理工具:Anothe ...