SQL是否区分大小写。我使用过的MySQL和SQL Server似乎都是敏感的。总是这样吗?标准是否定义了区分大小写?
答案 0 :(得分:167)
SQL关键字不区分大小写(SELECT
,FROM
,WHERE
等),但通常以全部大写编写。但是在某些设置中,表和列名称区分大小写。 MySQL有一个配置选项来启用/禁用它。通常区分大小写的表和列名称是Linux上的默认值,不区分大小写在Windows上是默认值,但现在安装程序在安装过程中询问了这一点。对于MSSQL,它是数据库的排序规则设置的函数。
答案 1 :(得分:21)
这不是严格的SQL语言,但在SQL Server中,如果数据库排序规则区分大小写,则所有表名都区分大小写。
答案 2 :(得分:15)
在Sql Server it is an option中。打开它很糟糕。
我不确定MySql。
答案 3 :(得分:14)
标识符和保留字不应区分大小写,尽管许多标准符和保留字遵循惯例使用大写字母用于保留字和Pascal大小写用于标识符。
见SQL-92秒。 5.2
答案 4 :(得分:11)
SQL92 specification表示标识符可能被引用或不引用。如果双方都没有引用,那么它们总是不区分大小写,例如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等)上
答案 5 :(得分:10)
我的理解是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配置设置。
Here另一个SO问题是如何讨论RDBMS中是否需要区分大小写。
答案 6 :(得分:4)
没有。 MySQL不区分大小写,也不是SQL标准。通常的做法是将命令写成大写。
现在,如果你在谈论表/列名,那么它们是,但不是命令本身。
所以
SELECT * FROM foo;
与
相同select * from foo;
但与
不一样select * from FOO;
答案 7 :(得分:4)
我发现this blog post非常有用(我不是作者)。总结(请阅读):
...分隔标识符区分大小写(“table_name”!=“Table_Name”),而非引用标识符不是,并且转换为大写(table_name =&gt; TABLE_NAME)。
他发现DB2,Oracle和Interbase / Firebird 100%兼容:
PostgreSQL ...小写每个不带引号的标识符,而不是大写它。 MySQL ...依赖于文件系统。 SQLite和SQL Server ...表和字段名称的大小写在创建时保留,但之后完全被忽略。
答案 8 :(得分:2)
SQL关键字本身不区分大小写。
表,列等的名称具有与数据库相关的区分大小写 - 除非您另有说明,否则您应该假设它们区分大小写(在许多数据库中它们不是;但在MySQL表名中有时区分大小写但大多数其他名字都没有。)
使用=,&gt;,&lt;比较数据等,具有案例意识,该案例意识取决于在各个数据库,表格或甚至列中使用的整理设置。但是,在数据库中保持校对相当一致是正常的。我们有几列需要存储区分大小写的值;他们有专门设置的校对。
答案 9 :(得分:1)
我认为SQL Server不区分大小写,至少在默认情况下不是。
当我通过Management Studio手动查询时,我总是把案件弄得一团糟,并乐意接受它:
select cOL1, col2 FrOM taBLeName WheRE ...
答案 10 :(得分:0)
两全其美
这几天,您可以只用小写形式编写所有sql语句,如果您需要对其进行格式化,则只需安装一个插件即可。仅当您的代码编辑器具有可用的插件时,此选项才适用。 VSCode 具有许多可以做到这一点的扩展。