Oracle的NLS_COMP和NLS_SORT参数

NLS_COMP和NLS_SORT参数 Oracle默认是采用binary进行排序,这对于例如中文的排序来说,是不恰当的。 使用这两个参数可以指定排序的方法,比如拼音或是,要注意可能会引起性能问题。 解决方法是使用NLSSORT函数来建立一个函数索引。 NLS_COMP = { BINARY | LIN

NLS_COMP和NLS_SORT参数
Oracle默认是采用binary进行排序,这对于例如中文的排序来说,是不恰当的。
使用这两个参数可以指定排序的方法,比如拼音或是,要注意可能会引起性能问题。
解决方法是使用NLSSORT函数来建立一个函数索引。

NLS_COMP = { BINARY | LINGUISTIC | ANSI }

BINARY
Normally, comparisons in the WHERE clause and in PL/SQL blocks is binary unless you specify theNLSSORT function.
LINGUISTIC
Comparisons for all SQL operations in the WHERE clause and in PL/SQL blocks should use the linguistic sort specified in theNLS_SORT parameter. To improve the performance, you can also define a linguistic index on the column for which you want linguistic comparisons.
ANSI
A setting of ANSI is for backwards compatibility; in general, you should setNLS_COMP to LINGUISTIC

NLS_SORT = { BINARY | linguistic_definition}
NLS_SORT specifies the collating sequence for character value comparison in various SQL operators and clauses, for example, ORDER BY, GROUP BY, comparison conditions (=, , =), IN, BETWEEN, LIKE, MIN/MAX, GREATEST/LEAST, and INSTR.

If the value is BINARY, then comparison is based directly on byte values in the binary encoding of the character values being compared. The ordering depends on the character set of the compared values, which is either the database character set (for VARCHAR2, CHAR, LONG, and CLOB) or the national character set (for NVARCHAR2, NCHAR, and NCLOB).

If the value is a named linguistic sort, then comparison is defined by this sort. A linguistic sort uses various rules to achieve ordering expected by speakers of one or more natural languages. This is usually the same ordering that is used in dictionaries and/or telephone directories in those languages.

The BINARY comparison is faster and uses less resources than any linguistic comparison but for text in a natural language, it does not provide ordering expected by users.
The value of NLS_SORT affects execution plans of queries. Because a standard index cannot be used as a source of values sorted in a linguistic order, an explicit sort operation must usually be performed instead of an index range scan. A functional index on the NLSSORT function may be defined to provide values sorted in a linguistic order and reintroduce the index range scan to the execution plan.

下面做个测试:
首先来看看可用的中文排序方法:
select value from v$nls_valid_values where parameter=’SORT’ and value like ‘%SCHINESE%’;
返回可用的中文排序方法
SCHINESE_PINYIN_M    — 按照拼音排序
SCHINESE_STROKE_M — 按照笔划(第一顺序)、部首(第二顺序)排序
SCHINESE_RADICAL_M — 按照部首(第一顺序)、笔划(第二顺序)排序

下面来做测试。
create index emp_ename_idx on emp(ename);
现在察看select * from emp where ename=’Mike’;的执行计划,
explain plan for select * from emp where ename=’Mike’;
select * from table(dbms_xplan.display);
可以看到Oracle会走索引emp_ename_idx。

1.———————————————————————————————  
2.| Id  | Operation                   | Name          | Rows  | Bytes | Cost (%CPU)| Time     |  3.———————————————————————————————   4.|   0 | SELECT STATEMENT            |               |     1 |    46 |     2   (0)| 00:00:01 |  5.|   1 |  TABLE ACCESS BY INDEX ROWID| EMP           |     1 |    46 |     2   (0)| 00:00:01 |  6.|*  2 |   INDEX RANGE SCAN          | EMP_ENAME_IDX |     1 |       |     1   (0)| 00:00:01 |  7.———————————————————————————————   8. 
9.Predicate Information (identified by operation id):  10.—————————————————   11. 
12.   2 – access(“ENAME”=U’Mike’)  alter session set nls_comp=’LINGUISTIC’;
alter session set nls_sort=’SCHINESE_PINYIN_M’;
之后再查看执行计划,得到结果:
1.————————————————————————–  
2.| Id  | Operation         | Name | Rows  | Bytes | Cost (%CPU)| Time     |  3.————————————————————————–   4.|   0 | SELECT STATEMENT  |      |     1 |    46 |     3   (0)| 00:00:01 |  5.|*  1 |  TABLE ACCESS FULL| EMP  |     1 |    46 |     3   (0)| 00:00:01 |  6.————————————————————————–   7. 
8.Predicate Information (identified by operation id):  9.—————————————————   10. 
11.   1 – filter(NLSSORT(“ENAME”,’nls_sort=”SCHINESE_PINYIN_M”’)=HEXTORAW  12.              (‘0230021B022301FE0000020202020007020202’) )  可以看到,现在走全表扫描了。
接下来,如果创建如下的索引
create index emp_ename_idx_nlssort on emp(nlssort(ename,’NLS_SORT=SCHINESE_PINYIN_M’));
再查看执行计划,发现又走索引emp_ename_idx_nlssort了。
1.—————————————————————————————————–  
2.| Id  | Operation                   | Name                  | Rows  | Bytes | Cost (%CPU)| Time     |  3.—————————————————————————————————–   4.|   0 | SELECT STATEMENT            |                       |     1 |    46 |     2   (0)| 00:00:01 |  5.|   1 |  TABLE ACCESS BY INDEX ROWID| EMP                   |     1 |    46 |     2   (0)| 00:00:01 |  6.|*  2 |   INDEX RANGE SCAN          | EMP_ENAME_IDX_NLSSORT |     1 |       |     1   (0)| 00:00:01 |  7.—————————————————————————————————–   8. 
9.Predicate Information (identified by operation id):  10.—————————————————   11. 
12.   2 – access(NLSSORT(“ENAME”,’nls_sort=”SCHINESE_PINYIN_M”’)=HEXTORAW(‘0230021B022301FE000  13.              0020202020007020202’) )

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 chuangxiangniao@163.com 举报,一经查实,本站将立刻删除。
发布者:程序猿,转转请注明出处:https://www.chuangxiangniao.com/p/462887.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
Java函数式编程如何与Hadoop或Spark框架集成实现并行计算?
上一篇 2025年11月8日 04:12:40
从 DeiT-B 到 DeiT-S,块结构化剪枝在深度 ViTs上 的应用 !
下一篇 2025年11月8日 04:12:53

相关推荐

  • mysql怎么执行sql命令 mysql输入代码创建表详细步骤

    mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤mysql怎么执行sql命令 mysql输入代码创建表详细步骤

    在mysql中执行sql并创建表的步骤如下:1.通过命令行或图形工具连接数据库,使用mysql -u 用户名 -p并输入密码登录;2.选择或创建数据库,用use database_name或create database语句;3.使用create table定义表结构,如字段名、数据类型、约束等,例…

    2026年9月22日 用户投稿
    300
  • MySQL最新版本如何下载?官方下载指南

    MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南MySQL最新版本如何下载?官方下载指南

    要下载mysql,推荐从官网直接下载;选择社区版或商业版取决于用途;下载时需选对操作系统和版本;安装遇到问题可查错误提示并搜索解决方案;验证安装成功可用命令行登录。下载步骤包括访问官网、选择版本与操作系统、使用installer、注册账号、开始下载安装。安装后配置root密码、字符集等。验证方式为命…

    2026年9月22日 用户投稿
    300
  • Flyway多数据库与CI/CD测试集成策略

    本文深入探讨了在CI/CD流程中,如何高效地配置Flyway以管理多数据库环境下的迁移,尤其关注集成测试场景。我们将比较使用真实数据库服务、Testcontainers以及Flyway自身多数据库配置的优劣,并提供关于分离生产与测试环境迁移脚本的实用策略,旨在确保开发、测试与生产环境的数据一致性与流…

    2026年9月22日
    300
  • Oracle定时任务

    oracle 介绍 oracle job 是应用在数据库层面,用来定时执行存储过程或者 SQL 语句的定时器。 测试数据代码语言:javascript代码运行次数:0运行复制 –建测试表CREATE TABLE TEST_JOB( DATETIME DATE, BEG_DATE VARCHAR2(…

    2026年9月22日
    500
  • mac怎么设置动态壁纸_mac设置动态壁纸方法

    可通过系统设置直接启用macOS自带的动态桌面;2. 利用iCloud同步功能实现Apple设备间的动态壁纸共享;3. 安装第三方应用扩展更多动态效果如视频或实时天气;4. 手动将.heic或.mov格式文件添加至指定目录以设置自定义动态壁纸。 如果您希望为Mac增添个性化视觉体验,可以将动态壁纸设…

    2026年9月22日
    300
  • MySQL数据备份自动化实施_MySQL定时任务与脚本管理

    MySQL数据备份自动化实施_MySQL定时任务与脚本管理MySQL数据备份自动化实施_MySQL定时任务与脚本管理MySQL数据备份自动化实施_MySQL定时任务与脚本管理MySQL数据备份自动化实施_MySQL定时任务与脚本管理

    mysql数据备份的自动化实施核心在于结合mysqldump等工具与操作系统的定时任务(如linux的cron或windows的task scheduler),通过编写和管理脚本实现定期执行备份。1. 使用mysqldump作为基础工具,编写包含数据库连接信息、时间戳文件名、日志记录、压缩清理等功能…

    2026年9月21日 用户投稿
    200
  • VSCode编写Java代码方法_VSCode搭建Java开发环境实战教程

    答案:在VSCode中配置Java开发环境需安装JDK并设置环境变量,再安装VSCode及Java扩展包,即可实现Java项目的创建、编写、运行与调试。它轻量、启动快,支持多语言和丰富扩展,集成Maven/Gradle,适合日常开发。 在VSCode里编写Java代码,说白了,就是把这个轻量级的代码…

    2026年9月21日
    100
  • 在Linux中如何通过命令行安装Java JDK

    在Linux中安装Java JDK可通过包管理器或手动安装,推荐使用系统自带工具安装OpenJDK。对于Ubuntu/Debian系统,先更新软件包列表:sudo apt update,再搜索可用版本:apt search openjdk-*,然后安装指定版本如OpenJDK 17:sudo apt…

    2026年9月20日
    000
  • 如何配置Scala与Java混合开发环境 Scala环境与JDK整合方法

    配置Scala与Java混合开发环境的关键是安装JDK、Scala并统一管理依赖。1. 安装JDK 8或11,配置JAVA_HOME和PATH;2. 安装Scala并设置SCALA_HOME;3. 使用SBT创建项目,配置build.sbt,组织src目录;4. 在IntelliJ IDEA中安装S…

    2026年9月20日
    100
  • 如何在Laravel中实现数据加密

    在laravel中实现数据加密的最直接且推荐方式是使用内置的crypt门面,其基于openssl并默认采用aes-256算法,通过app_key进行加解密。1. 使用crypt::encryptstring()或crypt::encrypt()对字符串或数组/对象进行加密;2. 使用crypt::d…

    2026年9月13日
    100
  • 如何在mysql中迁移分区表数据

    答案:MySQL分区表数据迁移需确保结构兼容性和数据完整性,常用方法包括:1. 使用INSERT INTO…SELECT迁移数据,要求目标表已存在且WHERE条件匹配分区范围;2. 通过mysqldump导出导入,适用于跨实例迁移,操作简单但大表性能差;3. 模拟EXCHANGE PAR…

    2026年9月10日
    100
  • thinkphp8相比thinkphp6有哪些新特性

    ThinkPHP8在性能、架构、功能和开发体验上全面升级,采用全新模块化架构,优化路由解析与数据库查询,提升响应速度;支持PHP 8.0+新特性,代码更简洁高效;增强中间件、路由、模型及验证功能,强化安全防护;兼容TP6代码,无缝升级,降低迁移成本。 ThinkPHP8 相比 ThinkPHP6 进…

    2026年9月10日
    400
  • Oracle DATE类型的时间组件处理与日期存储策略

    Oracle数据库的`DATE`数据类型始终包含日期和时间组件,即使未明确指定时间,系统也会默认填充午夜(00:00:00)。因此,当期望只存储日期时,实际存储的仍会包含时间部分。本文将深入探讨这一特性,并提供在SQL查询和应用程序层面有效管理和显示日期(不含时间)的策略,强调应通过格式化而非尝试修…

    2026年9月9日
    200
  • iPhone 14 Pro Max如何恢复系统默认设置

    先备份数据可避免丢失,通过设置中的【抹掉所有内容和设置】可恢复出厂设置;若手机异常则用电脑进入恢复模式,选择【恢复】重装系统。 想让iPhone 14 Pro Max恢复系统默认设置,也就是恢复出厂状态,有两个主要方法。操作前一定要记得先备份重要数据,比如用iCloud或电脑做一次完整备份,不然照片…

    2026年9月9日
    000
  • mysql中如何审计用户操作

    答案:MySQL审计可通过企业版插件、通用日志、触发器或外部工具实现。使用MySQL Enterprise Audit插件可详细记录登录与操作行为;社区版可启用general_log记录所有SQL语句,但影响性能;关键表可创建审计表和触发器追踪DML变更;还可结合Percona、ProxySQL或E…

    2026年9月9日
    100
  • 如何在安装完成后配置表空间管理

    首先创建表空间并指定存储路径与大小,Oracle和PostgreSQL通过CREATE TABLESPACE命令实现;接着可为用户设置默认表空间,避免每次建表显式指定;然后在建表时可通过TABLESPACE子句指定对象存储位置;定期使用系统视图或函数监控表空间使用情况,防止空间不足;当空间紧张时,可…

    2026年9月9日
    000
  • 什么是mysql数据库及其基本概念

    MySQL是开源关系型数据库,基于SQL操作,用于Web开发;包含数据库、表、行、列等基本概念,支持主键唯一标识和外键关联表,常用SQL语句包括SELECT、INSERT、UPDATE、DELETE,广泛应用于电商、博客等需数据持久化与一致性的场景。 MySQL 是一种广泛使用的关系型数据库管理系统…

    2026年9月8日
    100
  • mac怎么安装Xcode命令行工具_Mac安装Xcode命令行工具方法

    首先通过终端执行xcode-select –install命令可自动安装Xcode命令行工具,若失败则登录Apple开发者官网手动下载对应版本的Command Line Tools安装包,或通过App Store安装完整Xcode后启用内置工具,确保开发环境正常配置。 如果您在使用mac…

    2026年9月8日
    100
  • OpenJPA与Oracle:解决4000字节字符串限制警告

    当openjpa在oracle数据库环境中记录“warn: … is being mapped with a handler that may not be able to store values over 4000 bytes/chars long”警告时,这通常意味着实体中某个字符…

    2026年9月8日
    000
  • 数据量大的App制作,数据库如何选型?

    在开发处理大量数据的应用程序时,数据库的选择至关重要。选择一个合适的数据库不仅能确保数据的存储效率和安全性,还能提升应用程序的整体性能和用户体验。以下将从几个关键方面探讨如何为数据量大的app选择合适的数据库。 首先,考虑数据量的大小。 对于数据量庞大的应用程序,首要考虑的是数据库的存储能力和扩展性…

    2026年9月7日
    000

发表回复

登录后才能评论
关注微信