oracle 12.2+支持mysql与postgresql中的collate(排序规则)特性
sql server, mysql, postgresql都支持针对字符串类型定义排序规则的概念(collate),一般来说,排序规则分为三种:基于二进制,是否区分大小写,是否区分重音以及特定编码格式(典型的就是汉字在GBK和UTF-8中的编码值不同,会导致排序结果也不同)。
例如sql server中:
SELECT * FROM MyTable WHERE MyField = 'BobDillon' COLLATE Latin1_General_CI_AI
oracle可以使用:
SELECT * FROM MyTable WHERE NLSSORT(MyField, 'NLS_SORT = Latin_CI') = NLSSORT('BobDillon', 'NLS_SORT = Latin_CI')
postgresql中:
CREATE TABLE test1 ( a text COLLATE "de_DE", b text COLLATE "es_ES", ... ); SELECT a < ('foo' COLLATE "fr_FR") FROM test1;
https://www.postgresql.org/docs/13/collation.html
mysql中,可以在创建表的时候指定默认字符集以及排序规则,如下:
-- abc.abc definition CREATE TABLE `abc` ( `Id` int DEFAULT NULL, `Name` varchar(10) DEFAULT NULL ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试DDL'; select name from( select '王五' as name union select '张三' as name union select '李四' as name union select '赵六' as name )a order by name asc; -- 使用utf-8二进制排序 select name from( select '王五' as name union select '张三' as name union select '李四' as name union select '赵六' as name )a order by convert(name using gbk) asc; -- 使用GBK排序
oracle 12.2开始支持collate的概念,使用也类似:
CREATE TABLE t1 ( id NUMBER, company VARCHAR2(15 CHAR) COLLATE BINARY_CI, CONSTRAINT t1_pk PRIMARY KEY (id) ); INSERT INTO t1 VALUES (1, 'Löwenbrauerei'); INSERT INTO t1 VALUES (2, 'LÖwenbrauerei'); INSERT INTO t1 VALUES (3, 'Lowenbrauerei'); INSERT INTO t1 VALUES (4, 'LOwenbrauerei'); COMMIT; ALTER TABLE t1 ADD ( location VARCHAR2(15 CHAR) COLLATE BINARY_AI ); UPDATE t1 SET location = 'Bräunlingen' WHERE id = 1; UPDATE t1 SET location = 'BrÄunlingen' WHERE id = 2; UPDATE t1 SET location = 'Braunlingen' WHERE id = 3; UPDATE t1 SET location = 'BrAunlingen' WHERE id = 4; COMMIT; SELECT * FROM t1 WHERE location LIKE '%ä%'; ID COMPANY LOCATION ---------- --------------- --------------- 1 Löwenbrauerei Bräunlingen 2 LÖwenbrauerei BrÄunlingen 3 Lowenbrauerei Braunlingen 4 LOwenbrauerei BrAunlingen -- 也支持表级别默认的COLLATE CREATE TABLE t1 ( id NUMBER, company VARCHAR2(15 CHAR), CONSTRAINT t1_pk PRIMARY KEY (id) ) DEFAULT COLLATION BINARY_CI; -- schema级别也支持默认的COLLATE CREATE USER test2 IDENTIFIED BY test2 DEFAULT TABLESPACE users QUOTA UNLIMITED ON users DEFAULT COLLATION BINARY_CI; -- 还支持语句级别、会话级别
注:在PG内核实现中,collate是个编译时特性,和Domain、数据类型转换的实现逻辑类似,会被具体的函数重载(如GBK编码),在运行时并没有collate的概念。
更多可参考:
https://oracle-base.com/articles/12c/column-level-collation-and-case-insensitive-database-12cr2
https://blog.csdn.net/weixin_29944865/article/details/114773194 mysql排序规则
https://wenku.baidu.com/view/f1203fc81ae8b8f67c1cfad6195f312b3169eb9b.html mysql支持GBK排序
https://www.cnblogs.com/zhenren001/p/16578813.html、https://blog.csdn.net/qq_32935175/article/details/116002048 pg支持GBK排序
mysql字符集、collate排序规则、GBK各种bin/general/unicode排序规则:https://zhuanlan.zhihu.com/p/147207165、https://www.cnblogs.com/mydriverc/p/8308929.html、https://www.jianshu.com/p/de575dc67f4c、https://new.qq.com/rain/a/20210322A0BB3L00、https://ishare.ifeng.com/c/s/7pHoh3cgGpP
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 记一次.NET内存居高不下排查解决与启示
· 探究高空视频全景AR技术的实现原理
· 理解Rust引用及其生命周期标识(上)
· 浏览器原生「磁吸」效果!Anchor Positioning 锚点定位神器解析
· 没有源码,如何修改代码逻辑?
· 分享4款.NET开源、免费、实用的商城系统
· 全程不用写代码,我用AI程序员写了一个飞机大战
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· 白话解读 Dapr 1.15:你的「微服务管家」又秀新绝活了
· 上周热点回顾(2.24-3.2)
2016-08-31 mysql ALL_O_DIRECT引发的unaligned AIO/DIO导致hang