首页 > 数据库 >Collation 差异导致 KingbaseES 与 Oracle 查询结果不同

Collation 差异导致 KingbaseES 与 Oracle 查询结果不同

时间:2023-02-28 17:56:54浏览次数:53  
标签:en UTF t3 US system Collation Oracle KingbaseES id

问题引入

前端提了个问题,说是KingbaseES 返回的结果与 Oracle 返回的结果不一样。具体问题如下:

oracle 执行结果:oracle 有结果返回。

SQL> create table t3(id varchar(9));

Table created.

SQL>insert into t3 values('abcd');

1 row created.

SQL>select * from t3 where  id<='abc~';

ID
---------
abcd

 

KingbaseES 执行结果:无结果返回

test=# create table t3(id varchar(9));
CREATE TABLE
test=# insert into t3 values('abcd');
INSERT 0 1
test=# select * from t3 where  id<='abc~';
 id
----
(0 rows)

 

问题分析

查看数据库排序规则

test=# \l
                               List of databases
   Name    | Owner  | Encoding |   Collate   |    Ctype    | Access privileges
-----------+--------+----------+-------------+-------------+-------------------
 security  | system | UTF8     | en_US.UTF-8 | en_US.UTF-8 |
 template0 | system | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/system        +
           |        |          |             |             | system=CTc/system
 template1 | system | UTF8     | en_US.UTF-8 | en_US.UTF-8 | =c/system        +
           |        |          |             |             | system=CTc/system
 test      | system | UTF8     | en_US.UTF-8 | en_US.UTF-8 |

尝试用 collate "c" 验证

test=# select * from t3 where  id<='abc~' collate "C";
  id
------
 abcd
(1 row)

 

问题结论

1、oracle 默认 collation binary (可以看 dba_users.DEFAULT_COLLATION = 'USING_NLS_COMP' ,也就是参照nls_database_parameters.NLS_SORT 的值),二进制的排序可能并不适用于语言的规则。

2、KingbaseES 默认使用语言的规则进行排序,如果要使用二进制排序,可以使用 “C” or "POSIX"

 

最后再看个差异的例子:

oracle 二进制排序:

SQL> select * from t3 order by 1;

ID
---------
MacDonald
MacIntosh
Macdonald
Macintosh

 

KingbaseES en_US.UTF-8 排序

test=# select * from t3 order by 1;
    id
-----------
 Macdonald
 MacDonald
 Macintosh
 MacIntosh


test=# select * from t3 order by id collate "C";
    id
-----------
 MacDonald
 MacIntosh
 Macdonald
 Macintosh

 

标签:en,UTF,t3,US,system,Collation,Oracle,KingbaseES,id
From: https://www.cnblogs.com/kingbase/p/17043555.html

相关文章

  • KingbaseES V8R3 集群运维系列 -- 修改数据库服务端口
    ​案例说明:KingbaseESV8R3集群数据库服务端口(默认:54321)的配置在数据库及集群多个配置文件中都存在,修改端口需要更改所有的配置文件,本案例详细描述了数据库服务端口修改......
  • 怎样更直观的查看KingbaseES数据库日志
    数据库日志相关参数:默认设置log_destination='stderr'#Validvaluesarecombinationsof#stderr,csvlog,syslog,andeve......
  • KingbaseES V8R6 运维系列 --单机小版本升级
    ​案例说明:在KingbaseESV8R6版本提供了sys_upgrade的升级工具,本案例描述了KingbaseESV8R6单机环境下数据库的小版本升级操作,案例涉及的版本从‘(Kingbase)V008R006C0......
  • oracle上一些查询表和字段语句
    oracle上一些查询表和字段语句--查询表空间中表数据占用情况语句1SELECT2OWNER3,TABLESPACE_NAME4,SEGMENT_NAME5,SUM(BYTES)/1024......
  • Oracle 低版本客户端连接19C报错ORA-28040
    #适用范围12.2+#问题概述客户使用Oracle11.2客户端连接Oracle19c的时候,报错:ORA-28040:NomatchingauthenticationprotocolORA-28040:没有匹配的验证协议#问题原......
  • oracle中管理方式amm、asmm、assm、mssm
    1.如果数据库使用MANUAL方式管理SGA,需要改为AUTO方式,即将SGA_TARGET_SIZE设置为大于0的值。对于11g,由于HugePage只能用于共享内存,不能用于PGA,所以不能使用AMM,即不能设置......
  • oracle锁表,java代码修改方式如下
    selectb.owner,b.object_name,a.session_id,a.locked_modefromv$locked_objecta,dba_objectsbwhereb.object_id=a.object_id;selectb.username,b.sid,b.serial#,l......
  • oracle恢复数据using backup controlfile与until cancel的说明--转
    usingbackupcontrolfile与untilcancel的说明支持数据库版本:10gR2、11gR21.recoverdatabaseusingbackupcontrolfile2.recoverdatabaseuntilcancel3.recoverd......
  • KingbaseES V8R6 逻辑恢复到新的 schema
    前言本文介绍一下KingbaseESV8R6版本中逻辑恢复时,将原有的对象恢复到新的schema。sys_restore命令中如果只加入了-g(原schema)-G(新schema)参数那么导入数据后,表的schema......
  • KingbaseES Returning 的用法
    概述数据表更新时,如果需要对修改前后的数据进行记录或比较,需要返回更新前后的数据。KingbaseES可以通过UPDATE语句是否能直接返回影响的数据。KingbaseES支持insert,de......