SQL区分大小写吗?我用过MySQL和SQL Server,它们似乎都是不区分大小写的。情况总是这样吗?标准是否定义了区分大小写?
当前回答
在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等)上。
这不是严格的SQL语言,但在SQL Server中,如果您的数据库排序是区分大小写的,那么所有表名都是区分大小写的。
在SQL Server中,这是一个选项。打开它太糟糕了。
我不确定MySQL。
SQL关键字本身不区分大小写。
表名、列名等的区分大小写取决于数据库——你应该假定它们是区分大小写的,除非你知道另外的情况(在许多数据库中它们并不是;在MySQL中,表名有时区分大小写,但大多数其他名称不是)。
使用=、>、<等比较数据时,具有区分大小写的能力,这取决于正在使用的单个数据库、表甚至列上的排序规则设置。但是,在数据库中保持排序相当一致是正常的。我们有一些列需要存储区分大小写的值;它们有专门设置的排序规则。
我发现这篇博文很有帮助(我不是作者)。总结(请阅读):
带分隔符的标识符区分大小写("table_name" != "table_name"),而不带引号的标识符则不区分大小写,并且转换为大写(table_name => table_name)。
他发现DB2、Oracle和Interbase/Firebird是100%兼容的:
PostgreSQL……每个不带引号的标识符都要小写,而不是大写。MySQL……依赖于文件系统。SQLite和SQL Server…表和字段名的大小写在创建时被保留,但在创建后将完全忽略。
推荐文章
- 选项(RECOMPILE)总是更快;为什么?
- 设置数据库从单用户模式到多用户
- oracle中的RANK()和DENSE_RANK()函数有什么区别?
- 的类型不能用作索引中的键列
- SQL逻辑运算符优先级:And和Or
- 如何检查一个表是否存在于给定的模式中
- 添加一个复合主键
- 如何在SQL Server Management Studio中查看查询历史
- 可以为公共表表达式创建嵌套WITH子句吗?
- 什么时候我需要在Oracle SQL中使用分号vs斜杠?
- SQL Server的NOW()?
- 在SQL中,count(列)和count(*)之间的区别是什么?
- 在SQL Server中截断(不是四舍五入)小数位
- 仅在Datetime列上按日期分组
- PostgreSQL通配符LIKE用于单词列表中的任何一个