为什么Oracle区分大小写?

52

为什么Oracle区分大小写,而SQL Server和MySQL默认不区分大小写?

我知道有方法可以启用/禁用区分大小写,但是感觉Oracle与其他数据库不同。

我也在试图理解区分大小写的原因。我能看出“Table”和“TaBlE”可能被视为相等或不相等,但是否有一个例子证明区分大小写确实有所不同呢?

我对数据库还比较新,并且正在上课。


7
您是在谈论Oracle关键字、表名、列名等吗?根据我的经验,它们区分大小写。有点奇怪的是,Oracle会将这些标识符输出为全大写,但您可以使用任何大小写输入它们。 - Mike Sokolov
1
你在提到大小写敏感性时,特别是指哪些方面? - V4Vendetta
8
欢迎来到Oracle!"它似乎很奇怪,Oracle与其他数据库不同。" - Möoz
这个问题没有意义。Oracle不区分大小写,除非你是指where name = 'Smith'where name = 'SMITH'的区别,但这显然是标准的。此外,这是一个基于观点的问题,因此超出了SO的范围。晚些时候投票关闭。 - William Robertson
5个回答

81

默认情况下,Oracle标识符(表名、列名等)不区分大小写。您可以通过在其周围使用引号(例如:SELECT * FROM "My_Table" WHERE "my_field" = 1)使它们区分大小写。SQL关键字(SELECTWHEREJOIN等)始终不区分大小写。

另一方面,默认情况下字符串比较是区分大小写的(例如:WHERE field='STRING'将只匹配其值为'STRING'的列)。您可以通过将NLS_COMPNLS_SORT设置为适当的值(分别为LINGUISTICBINARY_CI)来使它们不区分大小写。

注意:当查询数据字典视图(例如:dba_tables)时,如果您没有使用引号创建它们,则名称将为大写,并且第二段所述的字符串比较规则也将适用于此处。

一些数据库(例如:Oracle、IBM DB2、PostgreSQL等)默认执行区分大小写的字符串比较,而其他一些数据库(SQL Server、MySQL、SQLite)则不区分大小写。这并不是标准做法,因此请注意您的数据库设置。


1
此外,在操作系统对大小写敏感的情况下,数据库表和列名通常也是大小写敏感的。例如,在 Linux 安装的 MySQL 表名为“Foo”,则无法使用“SELECT * FROM foo”引用它,而必须使用“SELECT * from Foo”。在 Windows 上,这两种语句都是有效的。 - Adrian J. Moreno
1
MySQL的大小写敏感行为取决于所使用的特定引擎,如果我没记错的话。MySQL也是个例外,因为大多数数据库不依赖于操作系统文件系统的大小写敏感性。 - David Taylor

10

Oracle实际上是不区分大小写处理字段和表名的,除非你在标识符周围使用引号。例如,如果你创建一个没有引号的表名,比如CREATE MyTable...,那么生成的表名将会被转换为大写(即MYTABLE),并且会以不区分大小写的方式对待。SELECT * from MYTABLE、SELECT * from MyTable、SELECT * from myTabLe都将匹配MYTABLE(请注意表名周围缺少引号)。这里有一篇关于这个问题的好文章,它更详细地讨论了这个问题,并比较了不同数据库的处理方式。


4

需要记住的是,对于SQL Server来说,大小写敏感性是基于排序规则的。默认的排序规则是不区分大小写的,但是这可以更改为区分大小写的。类似的一个例子是,为什么默认的Oracle数据库使用西欧字符集,而全球应用程序所使用的非 ASCII 字符需要UTF?我认为这只是供应商的偏好。


3
如果我要猜的话,我会说是出于历史/向后兼容性的原因。
Oracle 最早推出于1977年,当时使用的技术可能计算成本很高,难以处理大小写不敏感的搜索,所以他们选择了精确匹配。

0

对于一些应用程序来说,大小写敏感性很重要,而对于其他应用程序则不是。无论您使用哪种DBMS,业务需求都应该决定您是否需要大小写敏感性。我不会过于担心“默认设置”。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接