SQL语法区分大小写吗?


Answers:


181

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

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

这是MSDN中有关MSSQL归类文章


7
某些系统(例如PostgreSQL)在表名和列名中区分大小写,但是在查找它们之前,尝试通过对所有名称进行小写或大写将其隐藏。在这些系统上,必须将表名括在“双引号”中,以确保查找到您输入的确切名称。
Michael Ratanapintha

2
我不同意“但通常写成全大写”,这只是偏爱,实际上我总是看到相反的情况
BlackTigerX

3
例如,如果使用区分大小写的排序规则安装了MS Sql服务器,那么即使数据库具有不区分大小写的排序规则,表,列,变量名也变得区分大小写。
Vadym Stetsiak 09年

3
@BlackTigerX-Oracle手册中所有示例SQL的关键字(SELECT,FROM,WHERE等)均以大写形式编写,而表名和列名则以小写形式编写。
J. Polfer 2010年

嗯,这对mysql仍然适用吗?我以为我默认安装了mysql,列名不区分大小写。
卡扎伊2011年

22

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


16

在Sql Server中,这是一个选择。打开它很烂。

我不确定MySql。


在MySql中,不区分大小写是可以打开和关闭的选项。如果文件系统区分大小写(默认),那么这种不敏感就不会像您假设的那样在Linux上起作用。您必须在Linux上创建不区分大小写的文件系统,以使mysql不区分大小写的工作方式与在Windows上相同(=正确)。特别是在以另一种模式进行某些工作之后打开/关闭它可能会带来严重的后果。
Stefan Steiger 2014年

14

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

参见SQL-92秒。5.2


13

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 select)在您的应用程序中),您必须确保大小写是一致的,尤其是在带引号和未带引号的标识符不同的数据库(DB2,PostgreSQL等)上


10

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

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

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

SELECT fieldName
FROM tableName;

将从表名查询字段,但是

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问题。


5

不。MySQL不区分大小写,SQL标准也不区分大小写。大写命令只是一种惯例。

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

所以

SELECT * FROM foo;

是相同的

select * from foo;

但与

select * from FOO;

2
在大多数RDBMS中,表名也不区分大小写。至少不是默认情况下。MySQL是此规则最突出的例外。

4

我发现这篇博客文章非常有帮助(我不是作者)。总结(请阅读):

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

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

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


2

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

当我通过Management Studio手动查询时,我总是把大小写弄乱,它乐意接受它:

select cOL1, col2 FrOM taBLeName WheRE ...

2

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

表,列等的名称具有区分大小写的能力,这取决于数据库-除非另有了解,否则您应该假定它们区分大小写(在许多数据库中它们并非如此;在MySQL中,表名有时会区分大小写,但大多数其他情况下名称不是)。

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


0

两全其美

这些天,您可以只用小写形式编写所有sql语句,如果您需要对其进行格式化,则只需安装一个插件即可为您完成。仅当您的代码编辑器具有可用的插件时,此选项才适用。 VSCode具有许多可以做到这一点的扩展。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.