oracle为啥区分大小写?
Posted
技术标签:
【中文标题】oracle为啥区分大小写?【英文标题】:Reason why oracle is case sensitive?oracle为什么区分大小写? 【发布时间】:2011-11-17 12:24:48 【问题描述】:Oracle 区分大小写,而 SQL Server 和 MySQL 等其他默认情况下不区分大小写是否有原因?
我知道有一些方法可以启用/禁用区分大小写,但 oracle 与其他数据库的不同之处似乎很奇怪。
我还试图了解区分大小写的原因。我可以看到“Table”和“TaBlE”在哪里可以被认为是等价的而不是等价的,但是有没有一个区分大小写实际上会产生影响的例子?
我对数据库有点陌生,目前正在上课。
【问题讨论】:
你说的是Oracle关键字、表名、列名等吗?根据我的经验,这些是不区分大小写的。有点奇怪的是,Oracle 以全部大写形式输出这些标识符,但您可以输入任何您想要的大小写。 您对其他人特别提到了哪个区分大小写的事情?"it just seems weird that oracle differs from other databases."
大声笑,欢迎来到 Oracle!
这个问题没有意义。 Oracle 不区分大小写,除非您的意思是 where name = 'Smith'
与 where name = 'SMITH'
,但这肯定是标准的。另外,这是一个基于意见的问题,因此超出了 SO 的范围。投票结束,姗姗来迟。
【参考方案1】:
默认情况下,Oracle 标识符(表名、列名等)是不区分大小写的。您可以通过在它们周围使用引号使它们区分大小写(例如:SELECT * FROM "My_Table" WHERE "my_field" = 1
)。 SQL 关键字(SELECT
、WHERE
、JOIN
等)始终不区分大小写。
另一方面,默认情况下,字符串比较是区分大小写的(例如:WHERE field='STRING'
只会匹配'STRING'
的列)。您可以通过将NLS_COMP
和NLS_SORT
设置为适当的值(例如:分别为LINGUISTIC
和BINARY_CI
)使它们不区分大小写。
注意:查询数据字典视图(例如:
dba_tables
)时,如果您创建的名称不带引号,则名称将大写,此处将适用第二段中解释的字符串比较规则。
默认情况下,一些数据库(Oracle、IBM DB2、PostgreSQL 等)将执行区分大小写的字符串比较,而其他数据库则不区分大小写(SQL Server、mysql、SQLite)。这无论如何都不是标准的,所以请注意您的数据库设置是什么。
【讨论】:
此外,当安装它们的操作系统区分大小写时,数据库表和列名通常区分大小写。例如,在 Linux 安装中名为“Foo”的 MySQL 表不能被引用为“SELECT * FROM foo”,它必须是“SELECT * from Foo”。在 Windows 上,任一语句都是有效的。 MySQL 操作系统区分大小写的行为取决于所使用的特定引擎 IIRC。 MySQL 也比规则更例外,因为大多数数据库不依赖于 OS 文件系统的大小写敏感性。【参考方案2】:Oracle 实际上以不区分大小写的方式处理字段和表名称,除非您在标识符周围使用引号。如果您创建的表名周围没有引号,例如 CREATE MyTable...,则生成的表名将被转换为大写(即 MYTABLE),并将以不区分大小写的方式处理。 SELECT * from MYTABLE、SELECT * from MyTable、SELECT * from myTabLe 都将匹配 MYTABLE(注意表名周围没有引号)。这是一个nice article on this issue,更详细地讨论了这个问题并比较了数据库。
【讨论】:
【参考方案3】:请记住,对于 SQL Server,区分大小写是基于排序规则的。默认排序规则不区分大小写 - 但这可以更改为区分大小写。一个类似的例子是,当使用非 ASCII 字符的全局应用程序需要 UTF 时,为什么默认的 Oracle 数据库使用西欧字符集?我认为这只是供应商的偏好。
【讨论】:
【参考方案4】:如果我不得不猜测,我会说是出于历史/向后兼容性的原因。Oracle 于 1977 年首次问世,当时使用该技术进行额外工作的计算成本可能很高对于不区分大小写的搜索,他们只选择了完全匹配。
【讨论】:
【参考方案5】:对于某些应用程序,区分大小写很重要,而对于其他应用程序则不重要。无论您使用哪种 DBMS,业务需求都应确定您是否需要区分大小写。我不会太担心“默认”。
【讨论】:
以上是关于oracle为啥区分大小写?的主要内容,如果未能解决你的问题,请参考以下文章