第9章、语言结构

字符串常量

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

'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模式。这些序列中的每一个都以反斜杠(\)开始,称为转义字符

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关键字,并且这些结构分别生成 DATETIMEDATETIME值,如果指定,则包括尾随小数秒部分。该 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

十六进制

SELECT HEX('MySQL'),0x4D7953514C,x'4D7953514C',X'4D7953514C'

默认情况下,十六进制文字是一个二进制字符串,其中每对十六进制数字表示一个字符。

标识符命名限制

MySQL 中的某些对象,包括数据库,表,索引,列,别名,视图,存储过程,分区,表空间以及其他对象名称都被称为标识符。

  • 标识符使用引号(可选),但若标识符中包含特殊字符或者保留字,则必须使用引号。

  • 标识符在内部转化为Unicode字符,他们通常包括以下字符:

    • ASCII:U + 0001 .. U + 007F
    • 扩展字符:U+0080 .. U+FFFF
  • 标识符不允许使用 ASCII NUL (U + 0000)和补充字符 (U + 10000或更高)

  • 标识符可以以数字开头,但不能是纯数字

  • 数据库,表,列表不能以空格字符结尾

标识符的引号字符是反引号(`):

mysql> SELECT * FROM `select` WHERE `select`.id > 100;

ASNI_QUOTES启用了SQL模式,则可以使用双引号引用标识符。该ANSI_QUOTES模式使服务器将双引号字符串解释为标识符。因此,启用此模式时,字符串文字必须包含在单引号内。它们不能用双引号括起来。

在查询的SELECT列表中,可以使用标识符或字符串引用字符指定引用的列别名:

mysql> SELECT 1 AS `one`, 2 AS 'two';

不建议在命名使使用数字+英文+数字格式命名,因为这样可能会造成模糊不清的语意。举例:1e+3

小心使用MD5()生成表名,因为会产生上一条的问题。

下表描述了每种标识符的最大长度:

标识符 最大长度(字符)
Database 64
Table 64
Column 64
Index 64
Constraint 64
Stored Program 64
View 64
Tablespace 64
Server 64
Log File Group 64
Alias 256
Compound Statement Label 16
User-Defined Variable 64

标识符限定符

标识符可能合格或不合格。一个在上下文环境中可以正确推断无歧义的标识符是被允许的。限定名称至少包含一个限定符,通过重写默认上下文或提供缺失上下文来阐明解释上下文。

例如,该语句使用不限定名称t1创建一个表:

CREATE TABLE t1 (i INT);

因为t1未指明数据库,所以该次查询使用当前默认的数据库。如果当前未有默认数据库,则会抛出错误。

使用限定名db1.t1创建一个表:

CREATE TABLE db1.t1 (i INT);

因为已经指明了使用数据库db1,所以会在db1中创建表t1。如果不存在默认数据库,则必须指定数据库限定符。
如果存在默认数据库,且就是要使用的数据库,则可不指定数据库限定符(不推荐)。
如果存在默认数据库,但与要使用的不同,则必须指定数据库限定符。

限定符具备以下特征:

  • 不合格名称由单个标识符组成。限定名由多个标识符组成。
  • 限定符以.分隔。
  • 限定符是单独的字符串,不需要彼此相邻。如:tbl_name.col_nametbl_name . col_name是等价的。

标识符是区分大小写的,具体详情参照这里

关键字与保留字

对于非保留的关键字可不使用引号,对于保留的关键字得使用引号。

mysql> CREATE TABLE `interval` (begin INT, end INT);

BEGIN并且END是关键字但不保留,所以它们作为标识符的使用不需要引用。INTERVAL是一个保留关键字,必须用引号将其用作标识符。

避免使用保留字,避免因为语意含糊不清引发的问题。

保留字的清单可以在这里轻松查询到。

表达式语法

expr:
    expr OR expr
  | expr || expr
  | expr XOR expr
  | expr AND expr
  | expr && expr
  | NOT expr
  | ! expr
  | boolean_primary IS [NOT] {TRUE | FALSE | UNKNOWN}
  | boolean_primary

boolean_primary:
    boolean_primary IS [NOT] NULL
  | boolean_primary <=> predicate
  | boolean_primary comparison_operator predicate
  | boolean_primary comparison_operator {ALL | ANY} (subquery)
  | predicate

comparison_operator: = | >= | > | <= | < | <> | !=

predicate:
    bit_expr [NOT] IN (subquery)
  | bit_expr [NOT] IN (expr [, expr] ...)
  | bit_expr [NOT] BETWEEN bit_expr AND predicate
  | bit_expr SOUNDS LIKE bit_expr
  | bit_expr [NOT] LIKE simple_expr [ESCAPE simple_expr]
  | bit_expr [NOT] REGEXP bit_expr
  | bit_expr

bit_expr:
    bit_expr | bit_expr
  | bit_expr & bit_expr
  | bit_expr << bit_expr
  | bit_expr >> bit_expr
  | bit_expr + bit_expr
  | bit_expr - bit_expr
  | bit_expr * bit_expr
  | bit_expr / bit_expr
  | bit_expr DIV bit_expr
  | bit_expr MOD bit_expr
  | bit_expr % bit_expr
  | bit_expr ^ bit_expr
  | bit_expr + interval_expr
  | bit_expr - interval_expr
  | simple_expr

simple_expr:
    literal
  | identifier
  | function_call
  | simple_expr COLLATE collation_name
  | param_marker
  | variable
  | simple_expr || simple_expr
  | + simple_expr
  | - simple_expr
  | ~ simple_expr
  | ! simple_expr
  | BINARY simple_expr
  | (expr [, expr] ...)
  | ROW (expr, expr [, expr] ...)
  | (subquery)
  | EXISTS (subquery)
  | {identifier expr}
  | match_expr
  | case_expr
  | interval_expr
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 221,576评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,515评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,017评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,626评论 1 296
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,625评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,255评论 1 308
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,825评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,729评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,271评论 1 320
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,363评论 3 340
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,498评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,183评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,867评论 3 333
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,338评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,458评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 48,906评论 3 376
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,507评论 2 359

推荐阅读更多精彩内容