案例说明:

相同数据排序后查询,在MySQL和KingbaseES下得到的排序顺序不一致,本案例从MySQL和KingbaseES的排序规则分析,两种数据库排序的异同点。

适用版本:

KingbaseES V8R6、MySQL 8.0

一、MySQL的排序规则

1、排序规则(collation)

排序规则是依赖于字符集,字符集是用来定义MySQL存储不同字符的方式,而排序规则一般指对字符集中字符串之间的比较、排序制定的规则。一种字符集可以对应多种排序规则,但是一种排序规则只能对应指定的一种字符集,两个不同的字符集不能有相同的排序规则。

上图中,Collation 列表示排序方式,Charset 列表示字符集,可以看出 utf8 字符集对应着许多的排序方式,排序方式那一列每一项的值都不一样,并且每一项都对应唯一一种字符集,在这里是 utf8 字符集。

2、默认排序规则(字符集的默认排序规则)

每种字符集都有一个默认的排序规则, 可以通过下面的SQL语句查询指定字符集的默认排序规则:

mysql> show character set like 'utf8%';
+---------+---------------+--------------------+--------+
| Charset | Description | Default collation | Maxlen |
+---------+---------------+--------------------+--------+
| utf8 | UTF-8 Unicode | utf8_general_ci | 3 |
| utf8mb4 | UTF-8 Unicode | utf8mb4_general_ci | 4 |
+---------+---------------+--------------------+--------+
2 rows in set (0.00 sec)

上面的例子是查询字符集前缀包含utf8的默认排序方式,从中可以得知:

utf8字符集的默认排序方式是 utf8_general_ci 字符集中字符最大长度占3个字节
utf8mb4 字符集的默认排序方式是 utf8mb4_general_ci 字符集中字符最大长度占4个字节

3、指定数据库和表字符集及排序规则

1)指定数据库字符集和排序规则

mysql> create database prod1
CHARACTER SET =utf8 COLLATE=utf8_general_ci;
Query OK, 1 row affected, 2 warnings (0.01 sec) mysql> select SCHEMA_NAME,DEFAULT_CHARACTER_SET_NAME,DEFAULT_COLLATION_NAME
-> from INFORMATION_SCHEMA.SCHEMATA
-> where SCHEMA_NAME='prod1';
+-------------+----------------------------+------------------------+
| SCHEMA_NAME | DEFAULT_CHARACTER_SET_NAME | DEFAULT_COLLATION_NAME |
+-------------+----------------------------+------------------------+
| prod1 | utf8 | utf8_general_ci |
+-------------+----------------------------+------------------------+
1 row in set (0.00 sec)

2)指定表字符集和排序规则

mysql> create table t1 (id int)
-> ENGINE=InnoDB DEFAULT CHARSET=utf8 collate=utf8_general_ci ;
Query OK, 0 rows affected, 2 warnings (0.01 sec) mysql> show create table t1 \G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.01 sec)

4、查看表的字符集和排序规则

1)字符集为utf8mb4(默认排序规则)

mysql> show create table bdsj_bdgl_test\G
*************************** 1. row ***************************
Table: bdsj_bdgl_test
Create Table: CREATE TABLE `bdsj_bdgl_test` (
`BDSJ_BDGL_NM` varchar(32) NOT NULL,
`BDSJ_BDGL_BDBH` varchar(32) DEFAULT NULL,
`BDSJ_BDGL_BDLJ` varchar(256) DEFAULT NULL,
......
PRIMARY KEY (`BDSJ_BDGL_NM`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

如下图所示,(CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci)排序规则:

2)字符集为utf8(默认排序规则)

mysql> show create table bdsj_bdg2_test\G
*************************** 1. row ***************************
Table: bdsj_bdg2_test
Create Table: CREATE TABLE `bdsj_bdg2_test` (
`BDSJ_BDGL_NM` varchar(32) NOT NULL,
`BDSJ_BDGL_BDBH` varchar(32) DEFAULT NULL,
`BDSJ_BDGL_BDLJ` varchar(256) DEFAULT NULL,
.......
PRIMARY KEY (`BDSJ_BDGL_NM`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8
1 row in set (0.00 sec)

如下图所示,(CHARSET=utf8 )默认排序规则:

二、KingbaseES排序规则

1、排序规则(collation)

排序规则定义中有一个提供程序 , 它指定哪个库提供语言环境数据。一个标准的提供者名称是 libc , 它使用操作系统C库提供的语言环境。这些是操作系统提供的大多数工具使用的语言环境, 不同操作系统的 libc 版本不同可能会导致排序顺序略有不同。另一个提供者是 icu ,它使用外部ICU库。 只有在构建KingbaseES时配置了对ICU的支持,才能使用ICU区域设置。

libc 提供的排序规则对象映射到 setlocale() 系统调用接受的 LC_COLLATE 和 LC_CTYPE 设置的组合。 (正如其名字,一个排序规则的主要目的是设置 LC_COLLATE ,它控制排序顺序。 但是在实际中,很少有将 LC_COLLATE 设置成与 LC_CTYPE 不同,因此在同一个概念下收集这些设置比创建另一个基础结构来设置每一个表达式的 LC_CTYPE更加方便)。 此外,一个 libc 排序规则是和一个字符集编码(见 字符集 )绑定在一起的。 相同的排序规则名字可能存在于不同的编码中。

如下图所示,数据库字符集和对应的排序规则:

2、指定数据库的字符集

test=# create database prod2
test-# WITH ENCODING 'utf8' lc_collate='en_US.UTF-8' lc_ctype='en_US.UTF-8';
CREATE DATABASE test=# \l prod2
List of databases
Name | Owner | Encoding | Collate | Ctype | Access privileges
-------+--------+----------+-------------+-------------+-------------------
prod2 | system | UTF8 | en_US.UTF-8 | en_US.UTF-8 |
(1 row)

3、查看表数据排序

  • 表结构信息

  • 字符集为utf8,collate为ci_x_icu的排序:

    1)数据库字符集



    2)字段排序信息

  • 字符集为utf8,collate为en_US.UTF-8的排序:

    1)数据库字符集



    2)字段排序信息

三、总结

在数据库中,字符串(character)类型的字段数据在排序时,从左到右一个一个字符的进行比较, 按照数据库或表及字段的排序规则进行排序。通过对MySQL和KingbaseES字符串类型的排序比较,可以获取以下结果:

本文简单对比了MySQL和KingbaseES的排序规则,需要更深入了解数据库的排序,可以参考相关数据库的官方文档说明。

KingbaseES V8R6运维案例之---MySQL和KingbaseES字符串排序规则对比的更多相关文章

  1. (转)linux运维必会MySQL企业面试题

    linux运维必会MySQL企业面试题  老男孩教育运维班全体学员MySQL必会企业面试题最实战.最细致.最落地的运维实训基地,老男孩教育连续多年国内平均就业工资最高! 数据库的重要性是所有技术里最核 ...

  2. KingbaseES V8R6备份恢复案例之---自定义表空间指定恢复目录数据恢复

    案例说明: KingbaseES V8R6在通过sys_rman执行物理备份恢复时,可以通过参数'--kb1-path',指定恢复的数据(data)目录,但如果原备份中包含自定义表空间时,需要建立表空 ...

  3. Mysql Order By 字符串排序,mysql 字符串order by

    Mysql Order By 字符串排序,mysql 字符串order by ============================== ©Copyright 蕃薯耀 2017年9月30日 http ...

  4. MySQL数据库字符集和排序规则的四个级别

    MySQL数据库字符集和排序规则有四个级别的默认设置:服务器,数据库,表和列. 最初,服务器字符集和排序规则取决于启动mysqld时使用的选项.可以使用 --character-set-server该 ...

  5. KingbaseES V8R6集群管理运维案例之---repmgr standby switchover故障

    案例说明: 在KingbaseES V8R6集群备库执行"repmgr standby switchover"时,切换失败,并且在执行过程中,伴随着"repmr stan ...

  6. KingbaseES V8R6集群运维案例之---repmgr standby promote应用案例

    案例说明: 在容灾环境中,跨区域部署的异地备节点不会自主提升为主节点,在主节点发生故障或者人为需要切换时需要手动执行切换操作.若主节点已经失效,希望将异地备机提升为主节点. $bin/repmgr s ...

  7. KingbaseES V8R3集群运维案例之---cluster.log ERROR: md5 authentication failed

    案例说明: 在KingbaseES V8R3集群的cluster.log日志中,经常会出现"ERROR: md5 authentication failed:DETAIL: password ...

  8. 运维案例 | Exchange2010数据库损坏的紧急修复思路

    ​​关注嘉为科技,获取运维新知 Exchange后端数据库故障,一般都会是比较严重的紧急故障,因为这会直接影响到大面积用户的正常使用,而且涉及到用户数据.一旦遇到这种级别的故障,管理员往往都是在非常紧 ...

  9. KingbaseES V8R6备份恢复案例之---同一数据库创建不同stanza备份

    案例说明: 在生产环境,有的应用需要调用数据库的sys_rman做备份,为了区分数据库自身的sys_rman备份和应用的备份,可以使用不同的stanza name创建备份.本案例介绍了,如何在King ...

  10. KingbaseES V8R6备份恢复案例之--删除test数据库后sys_backup.sh备份

    案例说明: KingbaseES V8R6通过sys_backup.sh执行物理备份,默认sys_backup.sh执行备份初始化时,需要连接test数据库进行身份的认证:在一些生产环境为了安全需求, ...

随机推荐

  1. Java Socket设置timeout几种常用方式总结

    原文链接:https://my.oschina.net/shipley/blog/715196 最近碰到读取第三方提供socket接口需要设置超时时间问题,特此记录一下.原文中有几处拼写错误顺便改掉了 ...

  2. 升级 vcpkg 遇到的一些坑

    项目上有个需求要用到 wil 库,于是打开 cmd 输入: vcpkg install wil:x86-windows-static 等了很久,一直卡在配置命令 连续试了好几遍,还是不行,安装其他的静 ...

  3. mysql日期范围查找(两个日期之间的记录)

    转自:https://blog.csdn.net/lzxlfly/article/details/97577575?utm_medium=distribute.pc_relevant_t0.none- ...

  4. 正则表达式re模块---day18

    1.匹配单个字符 import re lst = re.findall(正则表达式,要匹配的字符串) 返回的是列表,按照正则表达式匹配到的内容都扔到列表中 # ### 1.预定义字符集 # \d 匹配 ...

  5. Anaconda下载安装步骤

    下载地址 下载比较慢的,用迅雷下,点击复制地址,然后在迅雷里面直接创建连接 Anaconda基于python3.8 Anaconda基于python3.6的 安装步骤 没啥说的,一路安装,中间有个勾选 ...

  6. 【系统设计】集团内部HR系统完结,项目从0到1总结

    最近一年学习了PMP,结合下PMP的知识,分享一下最近HR项目的全生命周期流程管理(需求分析.产品设计.系统开发.测试.上线.运营). 先一句话概括:战略分析-收集需求-流程梳理-关键需求-IT规划- ...

  7. python基础安装虚拟环境

    1.pip install virtualenv或者pip3 install virtualenv 2.在要存放虚拟环境的地方创建一个venv文件夹,用来存放所有创建的虚拟环境,方便查找与管理 3.m ...

  8. 【Azure 事件中心】关闭或开启Azure Event Hub SDK中的日志输出

    问题描述 使用Azure Event Hub的Java SDK 作为消费端消费消息,集成在项目中后,发现大量日志产生,并且都是Debug 级别日志,如何来关闭这部分日志输出呢? import com. ...

  9. 【Azure 应用服务】App Server 部署后,Docker报错,找不到8080端口

    问题描述 App Service for Container.  Docker Image 推送到ACR(向 Azure 容器注册表), 配置App Service并部署成功了.查看Docker日志( ...

  10. Java //内存解析