SQL语法是否区分大小写?
SQL是否区分大小写 我已经使用了MySQL和SQL Server,这两者似乎都是不敏感的。 这总是如此吗? 标准是否定义了区分大小写?
SQL关键字是不区分大小写的( SELECT
, FROM
, WHERE
等),但通常写在所有大写字母中。 但在某些设置中,表名和列名区分大小写。 MySQL有一个configuration选项来启用/禁用它。 通常区分大小写的表和列名称是Linux上的默认值,在Windows上默认情况下不区分大小写,但现在安装程序在安装过程中询问了这个问题。 对于MSSQL,它是数据库整理设置的一个function。
这是关于名称区分大小写的MySQL页面
这里是MSDN关于MSSQL整理的文章
这不是严格的SQL语言,但在SQL Server中,如果数据库归类是区分大小写的,则所有表名称都区分大小写。
标识符和保留字不应该是区分大小写的,尽pipe许多标准符合使用大写字母和Pascal标识符的惯例。
请参阅SQL-92 5.2
在Sql Server中是一个选项 。 把它打开。
我不确定MySql。
我的理解是,SQL标准要求不区分大小写。 不过,我不相信任何数据库都完全遵循这个标准。
对于区分大小写或不敏感的表名,MySQL的configuration设置是其“严格模式”的一部分(使得MySQL更符合标准的几个设置的抓包)。 不pipe这个设置如何,列名仍然是大小写不敏感的,尽pipe我认为它影响列名的显示方式。 我相信这个设置是在实例范围内,在RDBMS实例中的所有数据库中,尽pipe我今天正在研究以确认这一点(并希望答案是否定的)。
我喜欢Oracle如何更好地处理这个问题。 在直接的SQL中,表名和列名等标识符不区分大小写。 但是,如果出于某种原因,您确实希望获得明确的封装,则可以使用双引号(在Oracle SQL中与用于括起string数据的单引号完全不同)标识该标识符。 所以:
SELECT fieldName FROM tableName;
将从表名查询字段 名 ,但是
SELECT "fieldName" FROM "tableName";
将从tableName中查询fieldName 。
我敢肯定,你甚至可以使用这种机制将空格或其他非标准字符插入到标识符中。
在这种情况下,如果由于某种原因,你发现明确的表和列的名字是可取的,但它仍然是我要高度警惕的。
我每天使用Oracle的惯例是,在代码中,我会将所有Oracle SQL关键字放在大写字母中,并将所有标识符放在小写字母中。 在文档中,我会把所有的表名和列名放在大写字母中。 能够做到这一点非常方便和可读(尽pipe在代码中input如此多的首都有时会很痛苦 – 我相信我可以在这里find一个编辑器function来帮助)。
在我看来,MySQL在不同平台上的差异是非常糟糕的。 我们需要能够在Windows上转储数据库并将它们加载到UNIX中,如果Windows上的安装程序忘记将RDBMS置于区分大小写模式,则会造成灾难。 (公平地说,这是一场灾难,部分原因是我们的编程人员在很久以前就依靠UNIX上的MySQL的大小写敏感性做出了不好的决定。)编写Windows MySQL安装程序的人使得它非常方便,像Windows一样,向人们提供一个checkbox来说:“你愿意打开严格的模式,让MySQL更符合标准吗? 但是,MySQL与标准的差异非常方便,然后在不同的平台上转换和区别于自己的事实标准。 我相信,在不同的Linux发行版中,这可能会进一步复杂化,因为不同发行版的打包者有时会合并他们自己的首选MySQLconfiguration设置。
这是另外一个讨论区分敏感性在RDBMS中是否可取的问题。
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例如存储所有未加引号的标识符lowercased而不是uppercased,所以table_name == "table_name"
(这是完全相反的标准)。 此外,一些数据库始终不区分大小写,或者区分大小写取决于数据库中的某些设置,或者取决于系统的某些属性,通常是文件系统是否区分大小写。
请注意,某些数据库工具可能会始终发送引用标识符,因此在混合使用某些工具生成的查询(如由Liquibase或其他数据库迁移工具生成的CREATE TABLE查询)以及手工查询(如简单JDBCselect在您的应用程序中),您必须确保这些情况是一致的,特别是在引用和不引用标识符不同的数据库(DB2,PostgreSQL等)
我发现这个博客文章非常有帮助(我不是作者)。 总结(请阅读,虽然):
…分隔标识符区分大小写(“table_name”!=“Table_Name”),而非引号标识符不是,并且转换为大写(table_name => TABLE_NAME)。
他发现DB2,Oracle和Interbase / Firebird是100%兼容的:
PostgreSQL …降低每个不加引号的标识符,而不是大写。 MySQL …依赖于文件系统。 SQLite和SQL Server …表和字段名称的情况在创build时被保留,但是之后它们被完全忽略。
不。MySQL不区分大小写,也不是SQL标准。 写大写的命令是很常见的做法。
现在,如果你正在谈论表/列名,那么是的,但不是命令本身。
所以
SELECT * FROM foo;
是相同的
select * from foo;
但不一样
select * from FOO;
SQL关键字本身不区分大小写。
表,列等的名称有一个区分大小写的依赖于数据库 – 你应该假定它们区分大小写,除非你知道,否则(在许多数据库中,他们不是;虽然在MySQL表名是有时间区分大小写,但大多数名字不是)。
使用=,>,<等比较数据具有案例感知,其依赖于正在使用的个别数据库,表或列上的sorting规则设置。 但是,在数据库中保持整理的一致性是很正常的。 我们有几列需要存储区分大小写的值; 他们有一个专门设置的sorting规则。
我不认为SQL Server区分大小写,至less不是默认的。
当我通过Management Studio手动查询时,我总是搞不清情况,并高兴地接受它:
select cOL1, col2 FrOM taBLeName WheRE ...