sql语法区分大小写吗?

3wabscal  于 2021-06-21  发布在  Mysql
关注(0)|答案(11)|浏览(542)

sql区分大小写。我使用过mysql和sqlserver,它们看起来都是区分大小写的。总是这样吗?标准是否定义了区分大小写?

km0tfn4u

km0tfn4u1#

两全其美
现在,你可以用小写写下所有的sql语句,如果你需要格式化它,就安装一个插件。这只适用于代码编辑器有这些插件可用的情况。vscode有许多扩展可以做到这一点。

aemubtdh

aemubtdh2#

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将所有未加引号的标识符存储为小写而不是大写,因此 table_name == "table_name" (与标准正好相反)。另外,有些数据库始终不区分大小写,或者区分大小写取决于数据库中的某些设置,或者取决于系统的某些属性,通常不管文件系统是否区分大小写。
请注意,有些数据库工具可能会一直发送引用的标识符,因此在某些工具生成的查询(如liquibase或其他db迁移工具生成的create table查询)与手工生成的查询(如应用程序中的简单jdbc select)混合使用的情况下,必须确保案例一致,尤其是在带引号和不带引号标识符不同的数据库上(db2、postgresql等)

kq4fsx7k

kq4fsx7k3#

sql关键字本身不区分大小写。
表、列等的名称有一个依赖于数据库的大小写敏感度——除非您知道其他情况,否则您可能应该假设它们是区分大小写的(在许多数据库中它们不是;在mysql中,表名有时区分大小写,但大多数其他名称不区分大小写)。
使用=、>、<等比较数据时,会有区分大小写的意识,这取决于单个数据库、表甚至相关列上使用的排序规则设置。不过,在数据库中保持排序规则相当一致是正常的。我们有一些列需要存储区分大小写的值;它们有一套专门的排序规则。

mccptt67

mccptt674#

在sql server中,它是一个选项。打开它很糟糕。
我不确定mysql。

tvz2xvvm

tvz2xvvm5#

sql关键字不区分大小写( SELECT , FROM , WHERE 等),但通常都用大写字母书写。但是,在某些设置中,表名和列名区分大小写。mysql有一个配置选项来启用/禁用它。通常,linux mysql上的默认表名和列名是区分大小写的,windows上的默认表名和列名是不区分大小写的,但是现在安装程序在安装过程中询问了这个问题。对于mssql,它是数据库排序规则设置的函数。
下面是mysql页面关于名称区分大小写
下面是msdn中关于mssql排序规则的文章

2sbarzqh

2sbarzqh6#

我的理解是sql标准要求不区分大小写。不过,我不相信任何数据库完全遵循这个标准。
mysql有一个配置设置作为其“严格模式”的一部分(一个由多个设置组成的抓取包,使mysql更符合标准),用于区分大小写或不区分大小写的表名。不管此设置如何,列名仍然不区分大小写,尽管我认为它会影响列名的显示方式。我相信这个设置是示例范围的,跨rdbms示例中的所有数据库,尽管我今天正在研究以证实这一点(希望答案是否定的)。
我更喜欢甲骨文处理这个问题的方式。在straight sql中,表和列名等标识符不区分大小写。但是,如果出于某种原因确实希望获得显式的大小写,则可以将标识符括在双引号中(在oraclesql中,双引号与用于括住字符串数据的单引号完全不同)。所以:

SELECT fieldName
FROM tableName;

将从tablename查询fieldname,但是

SELECT "fieldName"
FROM "tableName";

将从tablename查询fieldname。
我很确定你甚至可以使用这个机制在标识符中插入空格或其他非标准字符。
在这种情况下,如果出于某种原因,您发现显式大小写的表和列名是可取的,那么您可以使用它,但这仍然是我要高度注意的事项。
当我每天使用oracle时,我的惯例是在代码中,我将把所有oraclesql关键字放在大写,所有标识符放在小写。在文档中,我会把所有的表名和列名都用大写。能够做到这一点是非常方便和可读的(尽管有时在代码中键入这么多大写字母会很痛苦——我肯定我可以在这里找到一个编辑器特性来提供帮助)。
在我看来,mysql对于在不同平台上对此的不同看法尤其不利。我们需要能够在windows上转储数据库并将它们加载到unix中,如果windows上的安装程序忘记将rdbms设置为区分大小写模式,那么这样做将是一场灾难(公平地说,这是一场灾难的部分原因是我们的编码人员很久以前做出了一个错误的决定,那就是在unix上依赖mysql的大小写敏感性。)编写windows mysql安装程序的人让它变得非常方便和像windows,很高兴能给人们一个复选框说“你想打开严格的模式,让mysql更符合标准吗?”但是mysql与标准有如此显著的不同是非常方便的,然后通过在不同的平台上改变和不同于它自己的实际标准使事情变得更糟。我敢肯定,在不同的linux发行版上,这可能会进一步复杂化,因为不同发行版的打包程序有时可能会合并他们自己喜欢的mysql配置设置。
这里有另一个如此重要的问题需要讨论,在rdbms中是否需要区分大小写。

pb3s4cty

pb3s4cty7#

这不是严格意义上的sql语言,但在sql server中,如果数据库排序规则区分大小写,则所有表名都区分大小写。

yhuiod9q

yhuiod9q8#

我觉得这篇博文很有帮助(我不是作者)。总结(请阅读):
…分隔标识符区分大小写(“表名称”!=”表\名称“),而非引用的标识符则不是,并且转换为大写(表\名称=>表\名称)。
他发现db2、oracle和interbase/firebird是100%兼容的:
postgresql。。。每个不带引号的标识符都用小写,而不是大写。mysql。。。依赖于文件系统。sqlite和sql server。。。表名和字段名的大小写在创建时会保留,但在创建之后会被完全忽略。

vlf7wbxs

vlf7wbxs9#

标识符和保留字不应区分大小写,尽管许多标识符遵循惯例,将大写字母用作保留字,将pascal case用作标识符。
见sql-92第。5.2

j13ufse2

j13ufse210#

我不认为SQLServer区分大小写,至少在默认情况下是不区分大小写的。
当我通过management studio手动查询时,我总是把案例搞砸,它欣然接受:

select cOL1, col2 FrOM taBLeName WheRE ...
brjng4g3

brjng4g311#

不,mysql不区分大小写,sql标准也不区分大小写。通常的做法是用大写写命令。
现在,如果您谈论的是表/列名,那么是的,但不是命令本身。
所以

SELECT * FROM foo;

与相同

select * from foo;

但不一样

select * from FOO;

相关问题