案例说明:

相同数据排序后查询,在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. seq2seq模型案例分析

    1 seq2seq模型简介 seq2seq 模型是一种基于[ Encoder-Decoder](编码器-解码器)框架的神经网络模型,广泛应用于自然语言翻译.人机对话等领域.目前,[seq2seq+at ...

  2. Flutter学习(PV)——概览

    接触flutter有一段时间了,趁着刚过完年有点时间,记录一些有用的东西,一方面给自己备忘,另一方面也希望能帮到有需要的人~ 一.什么是flutter Flutter is Google's UI t ...

  3. 项目实战:Qt监测操作系统物理网卡通断v1.1.0(支持windows、linux、国产麒麟系统)

    需求   使用Qt软件开发一个检测网卡的功能.  兼容windows.linux,国产麒麟系统(同为linux) Demo   windows上运行:       国产麒麟操作上运行:       功 ...

  4. 解决pip install时出现的Could not fetch URL https://pypi.org/simple/pip/问题

    打开windows的我的电脑,在最上方目录栏输入%APPDATA%,回车,接着会定位到一个新的目录, 目录路径为C:\Users\Administrator\AppData\Roaming,在这个目录 ...

  5. ABP Suite创建新项目

    启动Abp Suite ********************************************************************** ** Visual Studio ...

  6. 【Azure 环境】使用az login登录遇见OSError: [WinError -2146893813] : '' 错误

    问题描述 使用 az login指令登录,遇见 OS Error: [WinError -2146893813] : '', 在指令中添加 --debug后,输出的错误消息为: urllib3.con ...

  7. 主流开源分布式图计算框架 Benchmark

    本文由美团 NLP 团队高辰.赵登昌撰写,首发于 Nebula Graph Community 公众号 前言 随着近年来数据的爆炸式增长,如何高效地分析处理数据,在业界一直备受关注.现实世界中的数据往 ...

  8. [Python] 子线程退出孙线程不退出

    遇到了一个大坑! 如图,在子线程ThreadFunc退出之后,ThreadFunc2依旧在运行... 根本不会结束 但是官方文档中说明了,只要设置了daemon不为None 就能设置子线程是守护线程, ...

  9. Jmeter 之常数吞吐量作用

    一   添加方法: 线程组右键->添加->定时器-> 常数吞吐量定时器 二 作用: 常数吞吐量定时器的作用: 设置最大的吞吐量不超过设置的值 注意:如果线程能发送的请求远远低于设置的 ...

  10. Netty笔记(3) - 核心组件

    各组件关系示意图: Bootstrap 和 ServerBootstrap 说明: Bootstrap 意思是引导,一个 Netty 应用通常由一个 Bootstrap 开始,主要作用是配置整个 Ne ...