224

SQL 是否区分大小写。我使用了 MySQL 和 SQL Server,它们似乎都不区分大小写。总是这样吗?标准是否定义区分大小写?

4

11 回答 11

208

SQL 关键字不区分大小写(SELECTFROMWHERE等),但通常全部大写。但是,在某些设置中,表名和列名区分大小写。MySQL 有一个配置选项来启用/禁用它。通常区分大小写的表名和列名是 Linux MySQL 上的默认值,不区分大小写曾经是 Windows 上的默认值,但现在安装程序在安装过程中询问了这一点。对于 MSSQL,它是数据库排序规则设置的函数。

这是关于名称区分大小写的 MySQL 页面

这是MSDN 中关于 MSSQL 排序规则的文章

于 2008-09-30T16:52:16.083 回答
24

这不是严格意义上的 SQL 语言,但在 SQL Server 中,如果您的数据库排序规则区分大小写,那么所有表名都区分大小写。

于 2008-09-30T16:50:34.650 回答
20

SQL92 规范声明标识符可以被引用,也可以不被引用。如果双方都未引用,则它们始终不区分大小写,例如table_name == TAble_nAmE.

然而,带引号的标识符是区分大小写的,例如"table_name" != "TAble_naME". 同样基于规范,如果您希望将不带引号的标识符与带引号的标识符进行比较,那么如果不带引号的字符是大写的,则可以认为不带引号和带引号的标识符是相同的,例如TABLE_NAME == "TABLE_NAME",但是TABLE_NAME != "table_name"TABLE_NAME != "TAble_NaMe"

这是规范的相关部分(第 5.2.13 节):

     13)A <regular identifier> and a <delimited identifier> are equiva-
        lent if the <identifier body> of the <regular identifier> (with
        every letter that is a lower-case letter replaced by the equiva-
        lent upper-case letter or letters) and the <delimited identifier
        body> of the <delimited identifier> (with all occurrences of
        <quote> replaced by <quote symbol> and all occurrences of <dou-
        blequote symbol> replaced by <double quote>), considered as
        the repetition of a <character string literal> that specifies a
        <character set specification> of SQL_TEXT and an implementation-
        defined collation that is sensitive to case, compare equally
        according to the comparison rules in Subclause 8.2, "<comparison
        predicate>".

请注意,就像 SQL 标准的其他部分一样,并非所有数据库都完全遵循本节。例如,PostgreSQL 将所有未引用的标识符存储为小写而不是大写,因此table_name == "table_name"(这与标准完全相反)。此外,有些数据库始终不区分大小写,或者区分大小写取决于数据库中的某些设置或取决于系统的某些属性,通常是文件系统是否区分大小写。

请注意,某些数据库工具可能会一直发送引用的标识符,因此在您将某些工具生成的查询(例如 Liquibase 或其他数据库迁移工具生成的 CREATE TABLE 查询)与手工查询(例如简单的 JDBC 选择在您的应用程序中)您必须确保案例是一致的,尤其是在带引号和不带引号的标识符不同的数据库上(DB2、PostgreSQL 等)

于 2013-11-12T15:27:29.193 回答
17

在 Sql Server中它是一个选项。打开它很糟糕。

我不确定MySql。

于 2008-09-30T17:09:13.997 回答
14

标识符和保留字不应该区分大小写,尽管许多遵循约定使用大写作为保留字,使用 Pascal 大小写作为标识符。

请参阅SQL-92秒。5.2

于 2008-09-30T16:53:43.643 回答
13

我的理解是 SQL 标准要求不区分大小写。不过,我不相信任何数据库完全遵循标准。

MySQL 有一个配置设置作为其“严格模式”(使 MySQL 更符合标准的几个设置的抓包)的一部分,用于区分大小写或不敏感的表名。无论此设置如何,列名仍然不区分大小写,尽管我认为它会影响列名的显示方式。我相信此设置是实例范围的,跨越 RDBMS 实例中的所有数据库,尽管我今天正在研究以确认这一点(并希望答案是否定的)。

我喜欢 Oracle 如何更好地处理这个问题。在直接 SQL 中,表名和列名等标识符不区分大小写。但是,如果出于某种原因您确实希望获得显式大小写,则可以将标识符括在双引号中(这在 Oracle SQL 中与用于括起字符串数据的单引号完全不同)。所以:

SELECT fieldName
FROM tableName;

将从tablename查询fieldname,但是

SELECT "fieldName"
FROM "tableName";

将从tableName查询fieldName

我很确定您甚至可以使用这种机制将空格或其他非标准字符插入标识符中。

在这种情况下,如果由于某种原因您发现需要显式大小写的表和列名,那么您可以使用它,但我仍然要高度警告不要这样做。

当我每天使用 Oracle 时,我的约定是在代码中我将所有 Oracle SQL 关键字都用大写字母,所有标识符都用小写字母。在文档中,我会将所有表名和列名都大写。能够做到这一点非常方便和可读(尽管有时在代码中输入这么多大写字母很痛苦——我相信我可以在这里找到一个编辑器功能来提供帮助)。

在我看来,MySQL 在不同平台上对此有所不同是特别糟糕的。我们需要能够在 Windows 上转储数据库并将它们加载到 UNIX 中,如果 Windows 上的安装程序忘记将 RDBMS 置于区分大小写的模式,那么这样做是一场灾难。(公平地说,这是一场灾难的部分原因是我们的编码人员很久以前就做出了错误的决定,即依赖 UNIX 上的 MySQL 区分大小写。)编写 Windows MySQL 安装程序的人使它非常方便,并且类似于 Windows,并且向人们提供一个复选框以说“你想打开严格模式并使 MySQL 更符合标准吗?”真是太好了。但是 MySQL 与标准有如此显着的差异是非常方便的,然后通过在不同平台上转而与自己的事实标准不同,使事情变得更糟。我敢肯定,在不同的 Linux 发行版上,这可能会更加复杂,因为不同发行版的打包程序有时可能会合并他们自己喜欢的 MySQL 配置设置。

是另一个讨论在 RDBMS 中是否需要区分大小写的 SO 问题。

于 2008-12-04T14:36:52.887 回答
5

不,MySQL 不区分大小写,SQL 标准也不区分大小写。将命令写成大写只是一种常见的做法。

现在,如果您在谈论表/列名称,那么它们是,但不是命令本身。

所以

SELECT * FROM foo;

是相同的

select * from foo;

但不一样

select * from FOO;
于 2008-09-30T16:51:54.040 回答
4

我发现这篇博文很有帮助(我不是作者)。总结(尽管请阅读):

...分隔标识符区分大小写(“table_name”!=“Table_Name”),而未引用的标识符则不区分,并转换为大写(table_name => TABLE_NAME)。

他发现 DB2、Oracle 和 Interbase/Firebird 100% 兼容:

PostgreSQL ... 将每个未加引号的标识符小写,而不是大写。MySQL ...文件系统依赖。SQLite 和 SQL Server ......表和字段名称的大小写在创建时被保留,但之后它们被完全忽略。

于 2013-06-20T13:32:25.087 回答
2

我认为 SQL Server 不区分大小写,至少默认情况下是这样。

当我通过 Management Studio 手动查询时,我总是搞砸大小写,它欣然接受:

select cOL1, col2 FrOM taBLeName WheRE ...
于 2008-09-30T16:51:22.217 回答
2

SQL 关键字本身不区分大小写。

表、列等的名称区分大小写,这取决于数据库 - 您可能应该假设它们区分大小写,除非您另有说明(在许多数据库中它们不是;在 MySQL 中,表名有时区分大小写,但大多数其他名字不是)。

使用 =、>、< 等比较数据具有大小写意识,这取决于在单个数据库、表甚至相关列上使用的排序规则设置。但是,在数据库中保持排序规则相当一致是正常的。我们有几列需要存储区分大小写的值;他们有一个专门设置的排序规则。

于 2008-12-06T13:09:53.903 回答
0

两全其美

这些天你可以只用小写写你所有的 sql 语句,如果你需要格式化它,那么只需安装一个插件来为你做。这仅适用于您的代码编辑器有这些插件可用的情况。 VSCode有很多扩展可以做到这一点。

于 2020-05-16T00:51:16.113 回答