前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >第9章、语言结构

第9章、语言结构

作者头像
幺鹿
发布2018-08-21 16:02:16
6310
发布2018-08-21 16:02:16
举报
文章被收录于专栏:Java呓语

字符串常量

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

代码语言:javascript
复制
'a string'
"a string"
'a' ' ' 'string'

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

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

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

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

代码语言:javascript
复制
[_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

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

代码语言:javascript
复制
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

十六进制

代码语言:javascript
复制
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或更高)
  • 标识符可以以数字开头,但不能是纯数字
  • 数据库,表,列表不能以空格字符结尾

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

代码语言:javascript
复制
mysql> SELECT * FROM `select` WHERE `select`.id > 100;

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

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

代码语言:javascript
复制
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创建一个表:

代码语言:javascript
复制
CREATE TABLE t1 (i INT);

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

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

代码语言:javascript
复制
CREATE TABLE db1.t1 (i INT);

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

限定符具备以下特征:

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

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

关键字与保留字

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

代码语言:javascript
复制
mysql> CREATE TABLE `interval` (begin INT, end INT);

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

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

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

表达式语法

代码语言:javascript
复制
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
本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2018.03.30 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 字符串常量
  • 数字常量
  • 日期时间常量
  • 十六进制
  • 标识符命名限制
  • 标识符限定符
  • 关键字与保留字
  • 表达式语法
相关产品与服务
数据库
云数据库为企业提供了完善的关系型数据库、非关系型数据库、分析型数据库和数据库生态工具。您可以通过产品选择和组合搭建,轻松实现高可靠、高可用性、高性能等数据库需求。云数据库服务也可大幅减少您的运维工作量,更专注于业务发展,让企业一站式享受数据上云及分布式架构的技术红利!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档