图片 1

SQL语法 分隔符理解小结

1、常量
常量是一个包含文字与数字,十六进制或数字常量。一个字符串常量包含单引号(”)或双引号(“”)字符集中的一个或多个字符。
如果想在单引号分隔的字符串中用到单独的引号,可以在这个字符中用户连续的单引号。十六进制的常量表示不可打印的字符或者是其他二进制数据。每个十六进制常量都以0x开头,后面附带有字符或者数字。
有效字符常量举例: “abc” “ab .c” “123” ‘i don”t’ 0xafec
不属于字符常量: ‘ab’c’ –奇数个单引号 ‘a” –引号不是成对的
数字常量包含所有有记号或没记号的整数、定点值和浮点数。
以下属于数字常量: 130 -130 -0.351E5
一个常量通常有一直数据类型和长度,这取决于常量的格式。 2、分隔符
在T-SQL中,双引号有两层意思。除了应用字符串之外,双引号还能够用来做分隔符,也就是所有的定界表示符(delimited
identifier)。分隔标识符是标识的一种特殊类型,通常将保留关键字当做标识符并且用数据库对象的名称命名空间。
注:单引号和双引号之间的区别就在于前者是用于SQL92标准。标识符这种情况中,这种标准用于区分常规和分隔符。关键的两点就是分隔符是双引号引出的而且还区分大小写(T-SQL还支持用户方括号([])来代替双引号)。双引号只用于分隔字符串。一般来说,分隔标识符说明了标识符的规格,对保留关键字也起了同样的作用。分隔标识符还可以让不用名字(标识符、变量名),这些名字也可以再将来的SQL标准中用来作保留关键字。并且,分隔标识符还可能在标识符名种包含不合规定的字符,如空格。
在T-SQL的基本对象中,使用双引号是来定义SET语句的QUOTE_IDENTIFIER选项。如果这一选项设置为ON,那么双引号中的标识符就被定义成了分隔符。在这种情况下。双引号就不能用于分隔字符串。
3、标识符
T-SQL中,标识符用于失败数据库对象如数据库、表和索引,通过字符串表示出来,长度可以达到128个字符,还包含字母、数据或者下面的字符:_、@和#。每个名称都必须以一个字母或者以下字符中的一个字符开头:_、@或#。#在以它开头的表明或者存储程序名表示一个临时对象。而以@开头的时间则表示一个变量。
4、保留关键字
每种程序设计语言都有一系列有保留意见的名称,他们被写入并用在定义格式中。这些名称叫做保留关键字。

两者主要的区别在于:分隔的标识符被括在双引号中并且是区分大小写的。单引号只用于字符串的定界。总的来说,引入分隔的标识符是为了对标识符进行规范,否则就会与保留字相同了。特别要提到的是,分隔的标识符能够使你在命名的时候,免于使用在将来的SQL标准中可能出现的保留字。另外,分隔的标识符能够包含一些在通常的标识符名称中被视为不合法的字符,如空格。
在SQL SERVER中,双引号的使用由SET
语句中的QUOTED_IDENTIFIER选项来定义。如果这个选项被设为ON,则双引号中的标识符将被定义为一个分隔的标识符。在这种情况下,双引号不能被用于定界字符串。”
记住以下几句话就能把分隔符理解了
以上这段话是书上的原话,我对分隔的标识符的理解是:例如”hu”,”h u”,[hu],
[ h
u]这几个标识符都是不同的,在使用时就像使用a,b等标识符一样,只不过必须加上双引号或中括号,不知这样理解对不对。
我自己对分隔符的理解:分隔符就是为了起到分隔作用。 SELECT * FROM “My
Table” WHERE “Last Name” = ‘O”Brien’
自我分析:SELECT,FROM,where是关键字。”My
Table”就是标志符,而””就是分隔符 请大虾们指教。 其实你理解的挺对的
但是别忘了它的作用是为了定义标识符
符合所有标识符格式规则的标识符可以使用分隔符,也可以不使用分隔符。
不符合标识符格式规则的标识符必须使用分隔符。
分隔标识符在下列情况下使用:
当在对象名称或对象名称的组成部分中使用保留字时。
推荐不要使用保留关键字作为对象名称。从 Microsoft SQL Server
早期版本升级的数据库可能含有标识符,这些标识符包括早期版本中未保留而在
SQL Server 2000 中保留的字。可用分隔标识符引用对象直到可改变其名称。
当使用未被列为合法标识符的字符时。 SQL Server
允许在分隔标识符中使用当前代码页中的任何字符。但是,不加选择地在对象名称中使用特殊字符将使
SQL 语句和脚本难以阅读和维护。 Transact-SQL 所使用的分隔符类型: 说明
分隔符仅用于标识符。分隔符不能用于关键字,不论它们在 SQL Server
中是否被标记为保留字。 被引用的标识符用双引号 (“) 分隔开: SELECT *
FROM “Blanks in Table Name” 括在括号中的标识符用方括号 ([ ]) 分隔:
SELECT * FROM [Blanks In Table Name] 仅当 QUOTED_IDENTIFIER
选项设置为 ON 时,被引用的标识符才有效。默认情况下,当用于 SQL Server 的
Microsoft OLE DB 提供程序和 SQL Server ODBC 驱动程序连接时,将
QUOTED_IDENTIFIER 设置为 ON。默认情况下,DB-Library 不将
QUOTED_IDENTIFIER 设置为
ON。不管使用何种接口,个别应用程序或用户可随时更改设置。SQL Server
提供了多种方法来指定该选项。例如,在 SQL Server 企业管理器和 SQL
查询分析器中,该选项可在对话中设置。在 Transact-SQL 中,可以使用 SET
QUOTED_IDENTIFIER、sp_dboption 的 quoted identifier 选项或
sp_configure 的 user options 选项将此选项设为多种级别。 当
QUOTED_IDENTIFIER 为 ON 时,对于 SQL 语句中的双引号和单引号 (‘)
的使用,SQL Server 遵循 SQL-92 规则:
双引号只能用于分隔标识符,不能用于分隔字符串。
为保持与现有应用程序的兼容性,SQL Server
并不完全强制该规则。如果字符串没有超过标识符的长度,则该字符串可包含在双引号内。但不建议这样做。
单引号必须用来包含字符串,不能用于分隔标识符。
如果字符串包含单引号,则需要在单引号前再增加一个单引号: SELECT * FROM
“My Table” WHERE “Last Name” = ‘O”Brien’ 当 QUOTED_IDENTIFIER 为 OFF
时,对于双引号和单引号的使用,SQL Server 遵循如下规则:
引号不能用于分隔标识符,而是用括号作为分隔符。
单引号或双引号可用于包含字符串。
如果使用双引号,嵌入的单引号不需要用两个单引号来表示: SELECT * FROM
[My Table] WHERE [Last Name] = “O’Brien” 无论 QUOTED_IDENTIFIER
的设置如何,都可以在括号中使用分隔符。 分隔标识符规则
分隔标识符的格式规则是:
分隔标识符可以包含与常规标识符相同的字符数。本地临时表标识符最多可以包含
116 个字符。
标识符的主体可以包含当前代码页内字母的任意组合。例如,分隔符标识符可以包含空格、对常规标识符有效的任何字符以及下列任何字符:
代字号 (~) 连字符 (-) 惊叹号 (!) 左括号 ({) 百分号 (%) 右括号 (}) 插入号
(^) 撇号 (‘) and 号 (&) 句号 (.) 左圆括号 (() 反斜杠 (\) 右圆括号 ())
重音符号 (`)

字符串常量

字符串是包含在单引号(’)或双引号(”)字符中的字节或字符序列。
以下几行例子是等同的:

'a string'
"a string"
'a' ' ' 'string'

如果ANSI_QUOTES启用了SQL模式,则字符串文字只能在单引号内引用,因为在双引号内引用的字符串被解释为标识符。

  • 二进制字符串是一组字节。每个二进制字符串都有一个名为binary的字符集和排序规则。
  • 非二进制的字符串是一组字符。它具有二进制以外的字符集和与字符集兼容的排序规则。

对于这两种类型的字符串,比较都是基于字符串单元的数值。
对于二进制字符集,单位是字节,使用字节值进行比较;
对于非二进制字符集,单位是字符和字符集支持多字节字符,使用数值进行比较;

一个字符串文字可以有一个可选的字符集introducer和COLLATE
clause,用来指定它是一个使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]
// 例子
SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8'string' COLLATE utf8_danish_ci;

在一个字符串中,某些序列具有特殊的含义,除非NO_BACKSLASH_ESCAPES启用了SQL模式。这些序列中的每一个都以反斜杠(\)开始,称为转义字符

图片 1

image.png

这些%_序列用于搜索模式匹配上下文中的文字实例,%
_解释为通配符。

mysql> SELECT 'hello', '"hello"', '""hello""', 'hel''lo', '\'hello';
+-------+---------+-----------+--------+--------+
| hello | "hello" | ""hello"" | hel'lo | 'hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT "hello", "'hello'", "''hello''", "hel""lo", "\"hello";
+-------+---------+-----------+--------+--------+
| hello | 'hello' | ''hello'' | hel"lo | "hello |
+-------+---------+-----------+--------+--------+

mysql> SELECT 'This\nIs\nFour\nLines';
+--------------------+
| This
Is
Four
Lines |
+--------------------+

mysql> SELECT 'disappearing\ backslash';
+------------------------+
| disappearing backslash |
+------------------------+

在编写应用程序时,任何可能包含任何这些特殊字符的字符串必须在将该字符串用作发送到MySQL服务器的SQL语句中的数据值之前正确转义。

你可以通过两种方式来做到这一点:

  • 使用转义特殊字符的函数处理字符串。
  • 作为显式转义特殊字符的替代方法,许多MySQL
    API提供了一个占位符功能,使您能够将特殊标记插入到语句字符串中,然后在发出语句时将数据值绑定到它们。在这种情况下,API会负责为您转义值中的特殊字符。

数字常量

数字文字包括精确值(整数)和
DECIMAL文字和近似值(浮点)文字。

FLOATDOUBLE是浮点类型,其计算结果是近似值。

日期时间常量

日期和时间值可以用多种格式表示,例如带引号的字符串或数字,具体取决于值的确切类型和其他因素。

MySQL使用type关键字,并且这些结构分别生成
DATE
TIME
DATETIME值,如果指定,则包括尾随小数秒部分。该
TIMESTAMP语法产生
DATETIME在MySQL的价值,因为
DATETIME有更紧密地对应于标准SQL的范围
TIMESTAMP类型,其中有一年范围00019999。(MySQL的TIMESTAMP年份范围是19702038。)

MySQL识别日期/时间比较宽松,通常符合日期/时间规则的都可以被转化成功,具体可以参考链接:https://dev.mysql.com/doc/refman/5.7/en/date-and-time-literals.html。