案例说明:

相同数据排序后查询,在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. Swoole从入门到入土(10)——HTTP服务器[初步接触]

    讨论完了TCP服务器,接下来的话题就是HTTP服务器.HTTP这个协议"一般"是搭载在TCP协议上实现的. 注意,这里用"一般"是以前多数是这样做的,在&quo ...

  2. CSS实现页脚始终在页面底部

    说明 最近在布局自己的博客系统,我是想练练手把时下比较流行的前后端技术串起来.同时,我会把设计和编码过程中遇到的问题或值得分享的技术点.实现方式做下总结,记录下来.本篇就是第一篇,个人能力有限,不足之 ...

  3. Vue实现简单计算器功能

    知识点: v-model双向绑定 v-on事件绑定 实现效果 源码 <!DOCTYPE html> <html lang="en"> <head> ...

  4. 零难度指南:手把手教你如何通过在线Excel实现资产负债表

    前言 作为财务分析中的三大报表之一,资产负债表的作用是展示一个企业在特定时间点上的财务状况.今天小编就为大家介绍一下如何使用葡萄城公司的纯前端在线表格控件SpreadJS实现一个资产负债表. 环境准备 ...

  5. 细聊ASP.NET Core WebAPI格式化程序

    前言 我们在使用ASP.NET Core WebApi时它支持使用指定的输入和输出格式来交换数据.输入数据靠模型绑定的机制处理,输出数据则需要用格式化的方式进行处理.ASP.NET Core框架已经内 ...

  6. 内置方法,序列化模块pickle和json---day15

    1.内置方法 ads 绝对值函数 val = -16 res = abs(val) print(res) #16 round 四舍五入(n.5 n为偶数则舍去,n.5 n为奇数 则进一) 奇进偶不进 ...

  7. 标准运算符替代函数之operator模块

    # 官网参考示例地址 https://docs.python.org/zh-cn/3/library/operator.html # operator模块提供了一套与python的内置的运算符对应的高 ...

  8. 全面掌握Directory.Build.props

    为什么需要集中管理版本号? 1)同一个产品包含多个模块,对同一个包指定了不同的版本 比如A模块用了"Serilog.Sinks.Async"的"1.1.2"版本 ...

  9. 【Azure App Service】Local Git App Service的仓库代码遇见卡住不Clone代码的问题

    问题描述 启用App Service Local Git 部署,在Clone 代码库到本地时候,卡在Clone 'xxxxxx' ... ... 一动不动的问题? 问题解答 因为Git Clone没有 ...

  10. 【Azure IoT Hub】从设备端如何向IOT发送海量数据,可以使用从设备到IoT连接的直接传输吗?如何把IoT Hub中的数据存储到Azure Storage中?

    问题描述 IoT Hub 从设备端如何向IOT发送海量数据,可以使用从设备到IOT连接的直接传输吗?还是需要另外开启连接.另外,消息路由和上传文件使用的连接是否就是设备到IOT建立的连接?还是需要额外 ...