Ste*_*nby 192 sql case-sensitive
SQL区分大小写.我使用过的MySQL和SQL Server似乎都是敏感的.总是这样吗?标准是否定义了区分大小写?
Ste*_*sek 175
该SQL关键字是不区分大小写(SELECT
,FROM
,WHERE
等),但往往写在全部大写.但是在某些设置中,表和列名称区分大小写.MySQL有一个配置选项来启用/禁用它.通常区分大小写的表和列名称是Linux上的默认值,不区分大小写在Windows上是默认值,但现在安装程序在安装过程中询问了这一点.对于MSSQL,它是数据库的排序规则设置的函数.
Szt*_*upY 13
在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>".
Run Code Online (Sandbox Code Playgroud)
请注意,就像SQL标准的其他部分一样,并非所有数据库都完全遵循此部分.例如,PostgreSQL存储所有未加引号的标识符,而不是大写的,所以table_name == "table_name"
(这与标准完全相反).此外,某些数据库始终不区分大小写,或者区分大小写取决于数据库中的某些设置,或者取决于系统的某些属性,通常是文件系统是否区分大小写.
请注意,某些数据库工具可能始终发送引用的标识符,因此在您混合某些工具生成的查询(如Liquibase或其他数据库迁移工具生成的CREATE TABLE查询)的情况下,使用手工查询(如简单的JDBC选择)在您的应用程序中)您必须确保案例是一致的,特别是在引用和不带引号的标识符不同的数据库(DB2,PostgreSQL等)上
ski*_*ppy 10
我的理解是SQL标准要求不区分大小写.但我不相信任何数据库完全符合标准.
对于区分大小写或不敏感的表名,MySQL有一个配置设置作为其"严格模式"(一些使MySQL更符合标准的设置)的一部分.无论此设置如何,列名仍然不区分大小写,但我认为它会影响列名的显示方式.我相信这个设置是整个实例范围的,在RDBMS实例中的所有数据库中,尽管我今天正在研究确认这一点(并希望答案是否定的).
我喜欢Oracle如何更好地处理这个问题.在直接SQL中,表和列名称等标识符不区分大小写.但是,如果由于某种原因您真的希望获得显式大小写,则可以将标识符括在双引号中(这在Oracle SQL中与用于包含字符串数据的单引号完全不同).所以:
SELECT fieldName
FROM tableName;
Run Code Online (Sandbox Code Playgroud)
将从tablename查询fieldname,但是
SELECT "fieldName"
FROM "tableName";
Run Code Online (Sandbox Code Playgroud)
将从tableName查询fieldName.
我很确定你甚至可以使用这种机制将空格或其他非标准字符插入标识符.
在这种情况下,如果由于某种原因你发现明确的表格和列名称是可取的,你可以使用它,但它仍然是我要高度警告的东西.
我每天使用Oracle时的惯例是,在代码中我会将所有Oracle SQL关键字都设置为大写,所有标识符都设置为小写.在文档中,我将所有表和列名称放在大写.能够做到这一点非常方便和可读(虽然有时在代码中键入如此多的大写字母很痛苦 - 我确信我可以找到一个编辑器功能来帮助,这里).
在我看来,MySQL在不同平台上的差异特别糟糕.我们需要能够在Windows上转储数据库并将它们加载到UNIX中,如果Windows上的安装程序忘记将RDBMS置于区分大小写模式,那么这样做会很麻烦.(公平地说,这是一场灾难的部分原因是我们的编码员很久以前做出了错误的决定,依赖于UNIX上的MySQL的区分大小写.)编写Windows MySQL安装程序的人员非常方便像Windows一样,很高兴向人们提供一个复选框,说"你想打开严格的模式,让MySQL更符合标准吗?" 但是MySQL与标准的区别非常方便,然后通过扭转并在不同平台上与其自身的事实标准不同来改变事态.我敢肯定,在不同的Linux发行版上,这可能会更加复杂,因为不同发行版的打包器可能有时会合并他们自己喜欢的MySQL配置设置.
这是另一个SO问题,可以讨论RDBMS中是否需要区分大小写.
不。MySQL 不区分大小写,SQL 标准也不区分大小写。将命令写成大写是常见的做法。
现在,如果您在谈论表/列名称,那么是的,它们是,但不是命令本身。
所以
SELECT * FROM foo;
Run Code Online (Sandbox Code Playgroud)
是相同的
select * from foo;
Run Code Online (Sandbox Code Playgroud)
但不一样
select * from FOO;
Run Code Online (Sandbox Code Playgroud)