默认情况下,ORACLE 11g不区分大小写

默认情况下,ORACLE 11g不区分大小写,oracle,configuration,oracle11g,case-insensitive,Oracle,Configuration,Oracle11g,Case Insensitive,我在中发现,自ORACLE 10g以来,有一种方法可以使用ALTER session使特定的连接会话比较字符串不区分大小写,而不需要任何疯狂的SQL函数 是否有人知道,在11g中,是否有一种方法可以使数据库在所有新连接会话的默认情况下始终在此模式下运行,从而消除每次连接时运行ALTER SESSIONs的需要 或者,您可以在连接字符串上指定一个额外的参数来打开它?您可以使用alter system set=,将文章中提到的NLS_SORT,NLS_COMP参数设置为Oracle init文件中的

我在中发现,自ORACLE 10g以来,有一种方法可以使用
ALTER session
使特定的连接会话比较字符串不区分大小写,而不需要任何疯狂的SQL函数

是否有人知道,在11g中,是否有一种方法可以使数据库在所有新连接会话的默认情况下始终在此模式下运行,从而消除每次连接时运行
ALTER SESSION
s的需要


或者,您可以在连接字符串上指定一个额外的参数来打开它?

您可以使用
alter system set=,将文章中提到的
NLS_SORT
NLS_COMP
参数设置为Oracle init文件中的值子句

可以找到有关使用alter system命令的信息

以下是正确使用
NLS.*
参数的好方法。请注意,NLS_SORT参数的某些设置可能会导致性能问题,即当它未设置为二进制时。Oracle文档说明:

将NLS_排序设置为任何其他值 而二进制导致排序使用 全表扫描,不考虑 由优化器选择的路径。二元的 是异常,因为索引是 按照二进制顺序构建的 钥匙。因此,优化器可以使用 满足ORDER BY子句的索引 当NLS_排序设置为二进制时。如果 NLS_排序设置为任何语言 排序时,优化器必须包含 全表扫描和中的全排序 执行计划

当然可以

让您友好的DBA设置以下参数:

ALTER SYSTEM SET NLS_COMP=LINGUISTIC SCOPE=SPFILE; 

ALTER SYSTEM SET NLS_SORT=BINARY_AI SCOPE=SPFILE; 

这是我在

上的一篇短文,我尝试使用
登录触发器
发出以下命令来获取不区分大小写的查询:

execute immediate 'alter session set NLS_SORT=BINARY_CI';
execute immediate 'alter session set NLS_COMP=LINGUISTIC';
虽然这确实给了我CI,但也给了我难以置信的糟糕性能问题。我们有一个特别的表,没有这些设置,插入需要2毫秒。有了这些设置,插入需要3秒钟。我通过多次创建和删除触发器来确认这一点


我不知道在系统级别上使用触发器与在会话级别使用触发器相比,是否会产生不同。

我发现11g r2中的INSERT和nls存在相同的性能问题!幸运的是,对我来说,性能的影响还不够大,需要更换应用程序


如果您可以不使用二进制ci进行插入,那么我将在插入之前和之后执行alter会话,这样您就不必删除触发器

虽然该引用来自oracle文档,但“无论优化器选择的路径如何”也没有意义。关于这一点,更有用的参考是“关于正确使用NLS_*参数的良好链接”,我在回答中提供的链接和信息与您提供的相同,只是我回答中的链接来自11g文档。我现在正在处理这个问题,我发现为了避免性能问题,可以为列创建CI索引:在表名上创建索引名(NLSSORT(列名,'NLS\U排序=二进制CI');RC的回答中引用了什么。这样做会彻底破坏系统的性能吗?这似乎表明了这一点!这是相当可怕的性能打击!我不敢相信ORACLE还没有为这一点增加更好的支持。我的意思是,如果你在搜索发票、评论、笔记或几乎任何常见的文本字段,你真的不在乎有人写“带猫去看兽医”或“带猫去看兽医”,我们发现,使用这两种设置的诀窍在于必须在很多地方放置函数索引。在本例中,我们使用varchar2(32)uuid作为主键。由于两个NSL设置,没有使用任何正常的PK索引。我们必须添加索引,比如在Person上创建索引foo_ok(nlssort(Id,'NLS_SORT=BINARY_CI');为我们所有的PK.Egads干杯!要把“暮光之城”和“暮光之城”一视同仁,需要做大量的工作。我猜ORACLE实际上仍然停留在用大写字母存储所有内容的世界中。