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都会将这个混淆,当然这个情况也有一些情有可原的原因.一来两者本来就是相辅相成,相互依赖关联: 另外一方 ...
随机推荐
- Laravel入坑指南(7)——中间件Middleware
Laravel框架中引入了"中间件"这个概念,笔者觉得不是太合适.这里的Middleware和Java Servlet中的过滤器(Filter)就是一个东西,但是想比之下Filte ...
- Ubuntu在无网络环境下,用离线源apt-get安装软件
步骤概要如下: 1.假设目标安装的是服务器A,需先准备一台正常环境,且操作系统版本与A一致的服务器B: 2.用apt-get在服务器B上下载需要安装的包,并用dpkg-scanpackages依赖打包 ...
- linux 快速安装LAMP教程
最近学习linux,安装lamp遇到一些问题,记录下来分享一下: ------------------------------------------------------------------- ...
- ysoserial URLDNS利用链分析
在分析URLDNS之前,必须了解JAVA序列化和反序列化的基本概念.其中几个重要的概念: 需要让某个对象支持序列化机制,就必须让其类是可序列化,为了让某类可序列化的,该类就必须实现如下两个接口之一: ...
- 如何快速使用LayUI MINI框架
是什么 LayUI MINI是基于LayUI框架开发的一套最简洁.易用的后台框架模板,它已经是一个非常完整的脚手架,有现成的页面模板可以参考甚至是直接使用. 通常来说,如果我们准备开发一套管理系统的W ...
- live555开发笔记(一):live555介绍、windows上msvc2017编译和工程模板
前言 在pc上搭建流媒体服务器软件,打开视频接受推流,使用live555方案. live555介绍 Live555是一个为流媒体提供解决方案的跨平台的C++开源项目,它实现了标准流媒体传输 ...
- python中操作csv
示例 import csv with open('t.csv', mode='r', encoding='utf-8') as f: reader_obj = csv.reader(f) # 通过re ...
- 数据结构(三):舞伴配对问题(C++,队列)
好家伙, 题目如下: 1.舞伴配对问题:假设在周末舞会上,男士们和女士们进入舞厅时,各自排成一队.跳舞开始时,依次从男队和女队的队头上各出一人配成舞伴. 2.若两队初始人数不相同,则较长的那一队中未配 ...
- 【Azure 应用服务】PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢?
问题描述 PHP项目部署到App Service for Linux环境中,如何修改上传文件大小的限制呢? 问题解答 经过查询Azure App Service官方文档,可能通过在项目根目录下添加.h ...
- 【Azure API 管理】Azure API Management通过请求中的Path来限定其被访问的频率(如1秒一次)
问题描述 Azure API Management 是否可以通过请求中的Path来限定其被访问的频率? 在系统Request中发现某个Path 在短时间内被频繁的调用,影响了后台服务的性能及安全,所以 ...