SQL区分大小写吗?我用过MySQL和SQL Server,它们似乎都是不区分大小写的。情况总是这样吗?标准是否定义了区分大小写?
当前回答
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节):
A <regular identifier> and a <delimited identifier> are equivalent if the <identifier body> of the <regular identifier> (with every letter that is a lower-case letter replaced by the equivalent 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 <doublequote 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或其他DB迁移工具生成的CREATE TABLE查询)和手工查询(如应用程序中的简单JDBC选择)的情况下,必须确保情况一致,特别是在带引号和不带引号的标识符不同的数据库(DB2、PostgreSQL等)上。
其他回答
标识符和保留词不应该区分大小写,尽管许多标识符遵循一个约定,即保留词使用大写,标识符使用驼峰大小写。
参见SQL-92第5.2节
我不认为SQL Server是区分大小写的,至少默认情况下不是。
当我通过SQL Server Management Studio手动查询时,我总是搞砸情况,它很高兴地接受它:
select cOL1, col2 FrOM taBLeName WheRE ...
不。MySQL不区分大小写,SQL标准也不区分大小写。通常的做法是将命令写成大写。
现在,如果您谈论的是表/列名,那么是的,它们是,但不是命令本身。
So
SELECT * FROM foo;
和
select * from foo;
但不一样
select * from FOO;
在SQL Server中,这是一个选项。打开它太糟糕了。
我不确定MySQL。
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节):
A <regular identifier> and a <delimited identifier> are equivalent if the <identifier body> of the <regular identifier> (with every letter that is a lower-case letter replaced by the equivalent 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 <doublequote 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或其他DB迁移工具生成的CREATE TABLE查询)和手工查询(如应用程序中的简单JDBC选择)的情况下,必须确保情况一致,特别是在带引号和不带引号的标识符不同的数据库(DB2、PostgreSQL等)上。
推荐文章
- 如何在Ruby On Rails中使用NuoDB手动执行SQL命令
- 查询JSON类型内的数组元素
- 确定记录是否存在的最快方法
- MySQL区分大小写查询
- 获得PostgreSQL数据库中当前连接数的正确查询
- 在SQL选择语句Order By 1的目的是什么?
- 我如何循环通过一组记录在SQL Server?
- 如何从命令行通过mysql运行一个查询?
- 外键约束可能导致循环或多条级联路径?
- 使用LIMIT/OFFSET运行查询,还可以获得总行数
- 当恢复sql时,psql无效命令\N
- 货币应该使用哪种数据类型?
- 如何选择每一行的列值不是独特的
- 如何改变字符集(和排序)在整个数据库?
- mySQL:: insert到表,数据从另一个表?