SQL语法区分大小写吗?

229

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


1
Mysql中的大小写敏感性使用select where查询 - Praveenkumar_V
SQL-92,中级水平,强制使用大写 SQL。 - jarlh
11个回答

215

SQL关键字不区分大小写(例如SELECTFROMWHERE等),但通常会全部大写。但是,在某些设置中,表名和列名是区分大小写的。

MySQL有一个配置选项来启用/禁用它。通常情况下,Linux上的MySQL默认使用区分大小写的表名和列名,而Windows上曾经默认使用不区分大小写的方式,但现在安装程序会在设置期间询问这个问题。对于SQL Server,它是数据库排序规则设置的一种功能。

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

这里是MSDN上有关SQL Server排序规则的文章


10
某些系统(如PostgreSQL)在表名和列名中区分大小写,但会尝试通过将所有名称转换为小写或大写来隐藏它。在这些系统上,您需要用“双引号”括起表名以确保查找到您输入的精确名称。 - Michael Ratanapintha
2
我不赞同这种说法,这只是个人喜好而已。实际上,我总是看到相反的情况。 - BlackTigerX
4
例如,如果使用区分大小写的排序规则安装了 MS Sql Server,则无论数据库具有不区分大小写的排序规则,表、列、变量名称都会变成区分大小写。请注意,本人只进行翻译,不提供解释或其他任何额外信息。 - Vadym Stetsiak
4
Oracle手册中的所有SQL示例关键字(SELECT,FROM,WHERE等)都是大写,但表名和列名都是小写。 - J. Polfer
1
我最近(大约一周前)在Windows上安装了最新的MySQL 5.7.21服务器。它的表和列名不区分大小写,但在安装过程中安装程序没有询问此设置。 - Snackoverflow
显示剩余3条评论

25

这并非严格意义上的 SQL 语言,但如果您的数据库排序规则(collation)对大小写敏感,在 SQL Server 中,所有表名都是区分大小写的。


24
SQL-92规范指出标识符可以带引号或不带引号。如果两边都不带引号,则它们始终不区分大小写,例如,table_name == TAble_nAmE
然而,带引号的标识符是区分大小写的,例如,"table_name" != "TAble_naME"。此外,根据规范,如果您希望将不带引号的标识符与带引号的标识符进行比较,则如果未带引号的字符大写,则可以认为未带引号和带引号的标识符相同,例如,TABLE_NAME == "TABLE_NAME",但 TABLE_NAME != "table_name"TABLE_NAME != "TAble_NaMe"
以下是规范的相关部分(第5.2.13节):
  • 如果一个<常规标识符>的<标识符主体>(将每个小写字母替换为相应的大写字母)和一个<定界标识符>的<定界标识符主体>(将所有出现的<引号>替换为<引号符号>,并将所有出现的<双引号符号>替换为<双引号>),被视为指定了SQL_TEXT的<字符集规范>和对大小写敏感的实现定义排序规则的<重复的字符字符串字面量>,则它们是等价的,并且根据子句8.2中的比较规则“<比较谓词>”进行比较。
  • 请注意,与 SQL 标准的其他部分一样,并非所有数据库都完全遵循本节。例如,PostgreSQL 将所有未加引号的标识符存储为小写,而不是大写,因此 table_name == "table_name"(这恰好与标准相反)。此外,有些数据库始终不区分大小写,或者大小写敏感性取决于 DB 中的某些设置,或者取决于系统的某些属性,通常是文件系统是否区分大小写。
    请注意,某些数据库工具可能始终发送带引号的标识符,因此在混合使用某些工具生成的查询(例如由 Liquibase 或其他 DB 迁移工具生成的 CREATE TABLE 查询)和手工制作的查询时(例如应用程序中的简单 JDBC select),必须确保大小写一致,特别是在带引号和不带引号的标识符不同的数据库上(DB2PostgreSQL 等)。

    18

    在SQL Server中,这是一个选项。打开它很糟糕。

    我不确定MySQL是怎样的。


    在MySql中,大小写不敏感是一个可以开启和关闭的选项。只是如果文件系统是大小写敏感的(默认情况下),那么这种不敏感并不像你想象的那样在Linux上起作用。你必须在Linux上创建一个大小写不敏感的文件系统,才能使mysql的大小写不敏感与Windows上的工作方式相同(即正确)。特别是在另一种模式下进行一些工作后再切换大小写敏感性选项可能会带来不良后果。 - Stefan Steiger

    14

    标识符和保留字不应区分大小写,尽管许多人遵循使用大写字母表示保留字和使用大驼峰命名法表示标识符的约定。

    详见SQL-92第5.2节。


    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设置为区分大小写模式,则会造成灾难。 (公平地说,这是一场灾难的部分原因是我们的编码人员很久以前就做出了错误的决定,依赖于MySQL在UNIX上的区分大小写。)编写Windows MySQL安装程序的人使其变得非常方便和类似于Windows,并且朝着向用户提供一个复选框来说“您是否想打开严格模式并使MySQL更符合标准?”迈出了一大步。但是,MySQL之所以与标准差异如此之大,然后又在不同平台上与自己的事实标准有所不同,这非常方便。我相信在不同的Linux发行版上,这可能会进一步加剧,因为不同发行版的打包者可能会在某些时候纳入自己喜欢的MySQL配置设置。

    这里有另一个Stack Overflow的问题,讨论在RDBMS中是否需要大小写敏感。


    5
    不,MySQL不区分大小写,SQL标准也是如此。只是习惯性地将命令大写书写。
    如果您在谈论表/列名称,则它们是区分大小写的,但命令本身不是。
    因此,正确的写法是:
    SELECT * FROM foo;
    

    等同于

    select * from foo;
    

    但并非相同于

    select * from FOO;
    

    3
    在大多数关系型数据库管理系统中,表名通常也不区分大小写,至少默认情况下是这样。MySQL是这个规则最著名的例外。 - user1919238

    4
    我发现这篇博客文章很有帮助(我不是作者)。总结一下(请阅读):
    引号括起来的标识符区分大小写("table_name" != "Table_Name"),而非引号括起来的标识符则不区分大小写,并且会被转换为大写字母(table_name => TABLE_NAME)。
    他发现DB2、Oracle和Interbase/Firebird都是100%兼容的:
    PostgreSQL会将每个未加引号的标识符转换为小写,而不是大写。MySQL则依赖于文件系统。SQLite和SQL Server在创建时会保留表和字段名的大小写,但之后完全忽略它们。

    3

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

    当我通过 SQL Server Management Studio 手动查询时,我经常弄错大小写,但它仍然可以愉快地接受。

    select cOL1, col2 FrOM taBLeName WheRE ...
    

    2

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

    表名、列名等名称的大小写敏感性取决于数据库 - 除非您知道情况,否则应该假定它们是区分大小写的(在许多数据库中它们并不区分大小写;在MySQL中,表名有时区分大小写,但大多数其他名称不区分大小写)。

    使用=、>、<等比较数据时,大小写敏感性取决于使用的排序规则设置,这些规则可能是针对特定数据库、表甚至列的。然而,在一个数据库中保持排序规则相对一致是很正常的。我们有一些需要存储区分大小写值的列;它们具有特定的排序规则设置。


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