为什么oracle区分大小写?

时间:2011-09-15 02:18:27

标签: oracle database-design case-sensitive

Oracle是否存在区分大小写的原因,而其他类似SQL Server和MySQL的默认情况并非如此?

我知道有很多方法可以启用/禁用区分大小写,但是oracle与其他数据库的区别似乎很奇怪。

我也试图了解区分大小写的原因。我可以看到“Table”和“TaBlE”在哪里可以被认为是等价的而不是等价的,但有一个例子,区分大小写实际上会有所不同吗?

我对数据库有些新意,目前正在上课。

5 个答案:

答案 0 :(得分:66)

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

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

  

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

某些数据库(Oracle,IBM DB2,PostgreSQL等)默认情况下会执行区分大小写的字符串比较,其他数据库不区分大小写(SQL Server,MySQL,SQLite)。这不是标准,所以只需要知道你的数据库设置是什么。

答案 1 :(得分:7)

Oracle实际上以不区分大小写的方式处理字段和表名,除非您使用标识符周围的引号。如果在名称周围创建一个没有引号的表,例如CREATE MyTable ...,则生成的表名将转换为大写(即MYTABLE),并将以不区分大小写的方式处理。来自MYTABLE的SELECT *,来自MyTable的SELECT *,来自myTabLe的SELECT *都将匹配MYTABLE(注意表名周围缺少引号)。这是nice article on this issue,它更详细地讨论了这个问题,并对数据库进行了比较。

答案 2 :(得分:3)

如果我不得不猜测,我会说出历史/向后兼容的原因 Oracle于1977年首次出现,当时使用该技术进行不区分大小写搜索的额外工作可能在计算上非常昂贵,因此他们只选择完全匹配。

答案 3 :(得分:3)

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

答案 4 :(得分:0)

对于某些应用,区分大小写非常重要,而对于其他应用则不然。无论您使用哪种DBMS,业务要求都应确定您是否需要案例敏感性。我不会太担心“默认”。