为什么Oracle区分大小写,而SQL Server和MySQL默认不区分大小写?
我知道有方法可以启用/禁用区分大小写,但是感觉Oracle与其他数据库不同。
我也在试图理解区分大小写的原因。我能看出“Table”和“TaBlE”可能被视为相等或不相等,但是否有一个例子证明区分大小写确实有所不同呢?
我对数据库还比较新,并且正在上课。
为什么Oracle区分大小写,而SQL Server和MySQL默认不区分大小写?
我知道有方法可以启用/禁用区分大小写,但是感觉Oracle与其他数据库不同。
我也在试图理解区分大小写的原因。我能看出“Table”和“TaBlE”可能被视为相等或不相等,但是否有一个例子证明区分大小写确实有所不同呢?
我对数据库还比较新,并且正在上课。
默认情况下,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)则不区分大小写。这并不是标准做法,因此请注意您的数据库设置。
Oracle实际上是不区分大小写处理字段和表名的,除非你在标识符周围使用引号。例如,如果你创建一个没有引号的表名,比如CREATE MyTable...,那么生成的表名将会被转换为大写(即MYTABLE),并且会以不区分大小写的方式对待。SELECT * from MYTABLE、SELECT * from MyTable、SELECT * from myTabLe都将匹配MYTABLE(请注意表名周围缺少引号)。这里有一篇关于这个问题的好文章,它更详细地讨论了这个问题,并比较了不同数据库的处理方式。
需要记住的是,对于SQL Server来说,大小写敏感性是基于排序规则的。默认的排序规则是不区分大小写的,但是这可以更改为区分大小写的。类似的一个例子是,为什么默认的Oracle数据库使用西欧字符集,而全球应用程序所使用的非 ASCII 字符需要UTF?我认为这只是供应商的偏好。
对于一些应用程序来说,大小写敏感性很重要,而对于其他应用程序则不是。无论您使用哪种DBMS,业务需求都应该决定您是否需要大小写敏感性。我不会过于担心“默认设置”。
where name = 'Smith'
和where name = 'SMITH'
的区别,但这显然是标准的。此外,这是一个基于观点的问题,因此超出了SO的范围。晚些时候投票关闭。 - William Robertson