数据库区分大小写有什么好处吗?

22
我们刚刚将一个SQL Server 2005数据库从DEVEL迁移到TEST。在迁移过程中,数据库从大小写不敏感变为了大小写敏感,导致大多数SQL查询显然失败。
我想知道的是,拥有大小写敏感模式是否有明确的好处?
注意:我的意思是表名、列名、存储过程等。我并不是指实际存储在表中的数据。
初步检查,我找不到任何比大小写不敏感更好的理由。
8个回答

14

我刚刚发现了为什么我们要区分大小写。这是为了确保当我们将其部署到客户端站点时,我们的数据库可以正常工作,无论客户端的SQL Server是否设置为区分大小写。

这是一个出乎意料的答案。


这绝对是我们会这么做的唯一原因。 - nickd
2
另一个答案是:将你的测试系统一半设为区分大小写,另一半不区分大小写。这样可以捕捉到两类错误。 - Darron
我们在 DEV 和 TEST 上有不同的服务器排序规则。这确保我们始终在创建任何临时表(例如在 SProc 中)和任何日期格式化时都指定 COLLATE,以防意外依赖服务器设置。 - Kristen
1
补充Darron的评论。如果您在开发时区分大小写,在部署时不区分大小写,可能会因为重复使用仅大小写不同的标识符而导致错误。在我看来,服务器配置影响Transact-SQL的大小写敏感性是非常疯狂的。 - Disillusioned

7
我真的想不出为什么SQL标识符应该区分大小写。我可以想到一个糟糕的理由,就是MySQL给出的表名区分大小写的原因之一。每个表都是磁盘上的一个文件,您的文件系统区分大小写,MySQL开发人员忘记了table_file = lc(table_name)。当您将MySQL模式移动到不区分大小写的文件系统时,这非常有趣。
我能想到一个很重要的理由,它们不应该区分大小写。某些模式作者会聪明地决定this_table显然与This_Table有所不同,并创建这两个表(或列)。在模式的这一点上,您可能会写下“在此处插入错误”。
此外,不区分大小写让您在SQL中更加表达自己,以强调表和列与命令的区别,而不受模式作者决定的限制。
SELECT this, that FROM Table;

5

并非Unicode的所有部分都具有大小写字符之间的双射映射,甚至没有两个大小写字符集。

在这些区域中,“不区分大小写”有点无意义,可能会误导。

就目前而言,除非您想让Foo和foo不同,否则在ASCII集中我看不出有什么意义。


1
好奇有多少人知道双射的含义?:-) 没有基本集合论/组合数学知识的人将在没有维基百科的情况下一无所知。 - Bill

3

大多数语言包括大多数比较算法、文件系统等都是大小写敏感的。大小写不敏感是为了懒惰的用户而设计的。虽然它确实使得输入更容易,但是它也导致了许多名称只有大小写区别的变体。

就我个人而言,在(MyTable, mytable, myTable, MYTABLE, MYTable, myTABLE, MyTaBlE)之间,我希望看到一个通用版本。


1
大小写不敏感是为了偷懒的用户,我并不赞同。与代码不同,SQL是用于应急排查问题的。当您需要支持一个应用程序,并在现场编写查询时,这会产生影响。始终会存在一张表或字段名称以错误格式创建,这会让开发人员在编写SQL时感到烦恼。 - DidierDotNet

2

我喜欢大小写敏感,主要是因为我在编程Perl(以及大多数其他语言)时习惯了这种方式。我喜欢使用StudlyCaps来命名表格名称,并使用全部小写带下划线来命名列。

当然,许多数据库允许您引用名称来强制区分大小写,就像Postgres一样。那也是一个合理的方法。


2
大小写不敏感是一种福音,当你有开发者在编写SQL时未遵循任何约定或来自大小写不敏感的开发语言(如VB)时。通常情况下,我发现处理没有ID、id和Id是不同字段的数据库更容易。除了个人喜好之外,我强烈建议您保持大小写不敏感。我曾经使用过的唯一一个设置为区分大小写的数据库是Great Plains。我发现要记住他们模式命名的每个大小写是令人痛苦的。我没有机会使用更近期的版本。除非已经改变,如果我的记忆没错,你所说的大小写敏感性的性质是在安装时确定,并应用于所有数据库。正如我提到的运行Great Plains数据库的SQL Server安装中的所有数据库都是大小写敏感的情况一样。

1

我相信 SQL 规范要求对标识符进行大小写折叠(实际上等同于不区分大小写)。PostgreSQL 折叠为小写,ORACLE 折叠为大写。


1

我为Sybase Advantage数据库服务器提供支持,它使用平面文件格式,允许使用DBF以及我们自己的专有ADT格式。我看到大小写敏感性成为问题的情况是在使用我们的Linux版本服务器时。Linux是一个大小写敏感的操作系统,因此我们在数据库中有一个选项可以将所有调用转换为小写。这要求表文件必须是小写的。


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