SQL区分大小写吗? 我使用过MySQL和SQL Server,它们似乎都不区分大小写。这总是这样吗?标准是否定义了大小写敏感性?
SQL区分大小写吗? 我使用过MySQL和SQL Server,它们似乎都不区分大小写。这总是这样吗?标准是否定义了大小写敏感性?
SQL关键字不区分大小写(例如SELECT
,FROM
,WHERE
等),但通常会全部大写。但是,在某些设置中,表名和列名是区分大小写的。
MySQL有一个配置选项来启用/禁用它。通常情况下,Linux上的MySQL默认使用区分大小写的表名和列名,而Windows上曾经默认使用不区分大小写的方式,但现在安装程序会在设置期间询问这个问题。对于SQL Server,它是数据库排序规则设置的一种功能。
这并非严格意义上的 SQL 语言,但如果您的数据库排序规则(collation)对大小写敏感,在 SQL Server 中,所有表名都是区分大小写的。
table_name == TAble_nAmE
。"table_name" != "TAble_naME"
。此外,根据规范,如果您希望将不带引号的标识符与带引号的标识符进行比较,则如果未带引号的字符大写,则可以认为未带引号和带引号的标识符相同,例如,TABLE_NAME == "TABLE_NAME"
,但 TABLE_NAME != "table_name"
或 TABLE_NAME != "TAble_NaMe"
。table_name == "table_name"
(这恰好与标准相反)。此外,有些数据库始终不区分大小写,或者大小写敏感性取决于 DB 中的某些设置,或者取决于系统的某些属性,通常是文件系统是否区分大小写。在SQL Server中,这是一个选项。打开它很糟糕。
我不确定MySQL是怎样的。
SELECT fieldName
FROM tableName;
将从 tablename 查询 fieldname,但是
SELECT "fieldName"
FROM "tableName";
将从tableName查询fieldName。
我相信你甚至可以使用这种机制在标识符中插入空格或其他非标准字符。
在这种情况下,如果出于某种原因,你发现显式大小写的表和列名是可取的,那么它是可用的,但我仍然强烈建议不要这样做。
我的惯例是,在日常使用Oracle时,我会将所有Oracle SQL关键字放在大写字母中,并将所有标识符放在小写字母中。在文档中,我会将所有表和列名都放在大写字母中。这很方便和易读(尽管有时在代码中打这么多大写字母很麻烦——我相信我当时可以找到一个编辑器功能来帮助解决这个问题)。
在我看来,MySQL在不同平台上的差异特别严重。我们需要能够在Windows上转储数据库并将其加载到Unix上,如果Windows上的安装程序忘记将RDBMS设置为区分大小写模式,则会造成灾难。 (公平地说,这是一场灾难的部分原因是我们的编码人员很久以前就做出了错误的决定,依赖于MySQL在UNIX上的区分大小写。)编写Windows MySQL安装程序的人使其变得非常方便和类似于Windows,并且朝着向用户提供一个复选框来说“您是否想打开严格模式并使MySQL更符合标准?”迈出了一大步。但是,MySQL之所以与标准差异如此之大,然后又在不同平台上与自己的事实标准有所不同,这非常方便。我相信在不同的Linux发行版上,这可能会进一步加剧,因为不同发行版的打包者可能会在某些时候纳入自己喜欢的MySQL配置设置。
这里有另一个Stack Overflow的问题,讨论在RDBMS中是否需要大小写敏感。
SELECT * FROM foo;
等同于
select * from foo;
但并非相同于
select * from FOO;
我认为 SQL Server 不区分大小写,至少默认情况下是这样的。
当我通过 SQL Server Management Studio 手动查询时,我经常弄错大小写,但它仍然可以愉快地接受。
select cOL1, col2 FrOM taBLeName WheRE ...
SQL关键字本身是不区分大小写的。
表名、列名等名称的大小写敏感性取决于数据库 - 除非您知道情况,否则应该假定它们是区分大小写的(在许多数据库中它们并不区分大小写;在MySQL中,表名有时区分大小写,但大多数其他名称不区分大小写)。
使用=、>、<等比较数据时,大小写敏感性取决于使用的排序规则设置,这些规则可能是针对特定数据库、表甚至列的。然而,在一个数据库中保持排序规则相对一致是很正常的。我们有一些需要存储区分大小写值的列;它们具有特定的排序规则设置。