sql - Oracle REGEXP_INSTR() 和“az”字符范围与预期不匹配
问题描述
我想REGEXP_INSTR()
在 oracle 数据库中使用来检查小写/大写字符。我知道[:upper:]
和[:lower:]
POSIX 字符类,但我接受a-z
它给了我非常奇怪的结果,我不明白。有人可以解释一下吗?
SELECT REGEXP_INSTR('abc','[A-Z]',1,1,0,'c') FROM DUAL
-- Got 2, expected 0
SELECT REGEXP_INSTR('zyx','[A-Z]',1,1,0,'c') FROM DUAL
-- Got 1, expected 0
SELECT REGEXP_INSTR('ABC','[a-z]',1,1,0,'c') FROM DUAL
-- Got 1, expected 0
SELECT REGEXP_INSTR('ZYX','[a-z]',1,1,0,'c') FROM DUAL
-- Got 2, expected 0
SELECT REGEXP_INSTR('a3','[A-F0-9]',1,1,0,'c') FROM DUAL
-- Got 2, expected 2
SELECT REGEXP_INSTR('b3','[A-F0-9]',1,1,0,'c') FROM DUAL
-- Got 1, expected 2
SELECT REGEXP_INSTR('b3','[A-F0-9]') FROM DUAL
-- Got 1, expected 1 or 2
SELECT REGEXP_INSTR('a3','[A-F0-9]') FROM DUAL
-- Got 2, expected same as above
解决方案
行为的原因是排序规则。请参阅NLS_SORT
文档:
- 如果值为 BINARY,则 ORDER BY 查询的整理顺序基于字符的数值(需要较少系统开销的二进制排序)。
- 如果该值是命名语言排序,则排序基于定义的语言排序的顺序。NLS_LANGUAGE 参数支持的大多数(但不是全部)语言也支持具有相同名称的语言排序。
将 设置NLS_SORT
为BINARY
以便[A-Z]
可以按照与 ASCII 表中相同的顺序进行解析,
alter session set nls_sort = 'BINARY'
然后,您将获得一致的结果。
请参阅在线演示。
推荐阅读
- elasticsearch - Elasticsearch 为相同的查询提供不同的搜索结果
- sql - 列出所有表格元素和 count() 即使 count 为 0
- c# - 更改 File.Copy 默认缓冲区大小。
- android - Android editText setError 文本被截断
- angular - 在字段列表字符串 Cloud Firestore 中查询
- shell - 命令行 - 删除包含内容的目录而不删除内容
- yii2 - 如何在 Windows 10 上使用 vagrant 安装 yii2?
- php - Silverstripe 4 中类扩展 UserDefinedForm 的问题
- python - Matplotlib Semilogy 表示数据是否定的
- c# - 从存储桶 xxx 获取对象文件名.xlsx 时出错。确保它们存在并且您的存储桶与此函数位于同一区域?