当前位置:操作系统 > Unix/Linux >>

MySQL语言参考

6 MySQL 语言参考

  MySQL 拥有一个复杂的但直观易学的 SQL 接口。这个章节描述了各种不同的命令、类型和函数,为了高效地使用 MySQL 需要了解它们。这个章节也可以视为 MySQL 中包含的所有功能的参考。

  6.1 语言结构

  6.1.1 文字:怎么写字符串与数字

  这个章节描述了在 MySQL 中书写字符串与数字的各种不同方式。也包含有对各种不同差别和“gotchas”,当你在处理 MySQL 的基本类型时可能陷入的疑惑。

  6.1.1.1 字符串

  字符串是多个字符组成的一个字符序列,由单引号(“'”) 或双引号 (“"”) 字符包围。(但在 ANSI 模式中运行时只能用单引号)。

  例如:

  'a string'

  "another string"

  在一个字符串中,如果某个序列具有特殊的含义,每个序列以反斜线符号 (“\”)开头,称为转义字符。 MySQL 识别下列转义字符:

  \0

  一个 ASCII 0 (NUL) 字符。

  '

  一个 ASCII 39 单引号 (“'”) 字符。

  "

  一个 ASCII 34 双引号 (“"”) 字符。

  \b

  一个 ASCII 8 退格符。

  \n

  一个 ASCII 10 换行符。

  \r

  一个 ASCII 13 回车符。

  \t

  一个 ASCII 9 制表符(TAB)。

  \z

  ASCII(26) (Control-Z)。这个字符可以处理在 Windows 系统中 ASCII(26) 代表一个文件的结束的问题。(当使用 mysql database < filename 时 ASCII(26) 可能会引起问题产生。)

  \\

  一个 ASCII 92 反斜线 (“\”) 字符。

  \%

  一个 ASCII 37 “%” 字符。它用于在正文中搜索“%”的文字实例,否则这里“%”将解释为一个通配符。查看章节 6.3.2.1 字符串比较函数。

  \_

  一个 ASCII 95 “_” 字符。它用于在正文中搜索“_”的文字实例,否则这里“_”将解释为一个通配符。查看章节 6.3.2.1 字符串比较函数.

  注意如果在某些正文环境内使用 “\%” 或 “\_”,将返回字符串 “\%” 和 “\_” 而不是 “%” 和 “_”。

  字符串中包含引号的可以有下列几种写法:

  * 一个字符串用单引号“'”来引用的,该字符串中的单引号“'”字符可以用“''”方式转义。

  * 一个字符串用双引号“"”来引用的,该字符串中的“"”字符可以用“""”方式转义。

  * 你也可以继续使用在引号前加一个转义字符“\”来转义的方式。

  * 一个字符串用双引号“"”来引用的,该字符串中的单引号“'”不需要特殊对待而且不必被重复或转义。同理,一个字符串用单引号“'”来引用的,该字符串中的双引号“"”不需要特殊对待而且不必被重复或转义。

  下面显示的 SELECT 演示引号和转义是如何工作:

  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 |

  +--------------------+

  如果你想要把二进制数据插入到一个字符类型的字段中(例如BLOB),下列字符必须由转义序列表示:

  NUL

  ASCII 0,你应该用 “\0”(一个反斜线和一个ASCII “0”字符)表示它。

  \

  ASCII 92,反斜线。需要用 “\\” 表示。

  '

  ASCII 39,单引号。需要用 “'” 表示。

  "

  ASCII 34,双引号。需要用 “"” 表示。

  如果你写 C 代码,你可以使用 C API 函数mysql_real_escape_string() 来为 INSERT 语句转义字符。查看章节 8.1.2 C API 函数概述。在 Perl 中,你可以使用 DBI 包中的 quote 方法来将这些特殊字符转换成适当的转义序列。查看章节 8.5.2 DBI 接口。

  你应该在任何可能包含上述特殊字符的字符串中使用转义函数!

  另外,很多 MySQL API 提供了一些占位符处理能力,这允许你在查询语句中插入特殊标记,然后在执行查询时对它们绑定数据值。这样,API 会自动为你从数值中转换它们。

  6.1.1.2 数字

  整数被表示为一个数字序列。浮点数使用 “.” 作为一个十进制的分隔符。这两种类型的数字可以前置 `-' 以表示一个负值。

  有效整数的例子:

  1221

  0

  -32

  有效浮点数的例子:

  294.42

  -32032.6809e+10

  148.00

  一个整数可以在浮点语境中使用;它被解释为等值的浮点数。

  6.1.1.3 十六进制值

  MySQL 支持十六进制数值。在数字的语境中,它们表现类似于一个整数(64位精度)。在字符串的语境中,它们表现类似于一个二进制的字符串,每一对十六进制数字被转换为一个字符:

  mysql> SELECT x'4D7953514C';

  -> MySQL

  mysql> SELECT 0xa+0;

  -> 10

  mysql> SELECT 0x5061756c;

  -> Paul

  表达式 x'hexstring' (4.0 中新加入) 是基于 ANSI SQL 的,表达式 0x 是基于 ODBC 的。十六进制的字符串通常被 ODBC 用于为 BLOB 类型字段赋值。你可以通过 HEX() 将一个字符串或一个数值转化为十六进制格式。

  6.1.1.4 NULL 值

  NULL 值并不意味着“无数据”,并且是不同于例如数字类型的 0 或字符串类型的空串。查看章节 A.5.3 NULL 值问题。

  当使用文本文件导入与导出格式时 (LOAD DATA INFILE,SELECT ... INTO OUTFILE),NULL 可以用 \N 来描述。查看章节 6.4.9 LOAD DATA INFILE 句法.

  6.1.2 数据库、表、索引、列和别名

  数据库、表、索引、列和别名都需遵守 MySQL 同样的规则。

  注意,从 MySQL 3.23.6 开始,规则发生改变了,此时引进了用“`”引用标识符(数据库、表和字段名)。如果你以 ANSI 模式运行,“"” 也可以用于引用标识符。查看章节 1.8.2 以 ANSI 模式运行 MySQL。

  标识符 最大长度 允许的字符

  数据库 64 一个目录名中允许的任何字符,除了“/”、“\” 或 “.”。

  表 64 一个文件名中允许的任何字符,除了 “/” 或 “.”。

  列 64 所有的字符。

  别名 255 所胡的字符。

  注意,除了上面的,在一个标识符中还不能有 ASCII(0) 或 ASCII(255) 或引用字符。

  注意,如果标识符是一个受限掉的词或包含特殊的字符,当使用它时,必须以一个 ` (backtick) 来引用它。

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

  查看章节 6.1.7 MySQL 对保留字挑剔吗?。

  在 MySQL 3.23.6 以前的版本中,命名规则如下:

  * 一个名字可以由当前字符集中包含的文字与数字字符以及 “_” 和 “$” 组成。缺省字符集为 ISO-8859-1 Latin1;这可以通过改变 mysqld 的 --default-character-set 的选项来改变。查看章节 4.6.1 用于数据和排序的字符集。

  * 一个名字可以以在名字中合法的任何字符开始。特别地,一个名字可以以一个数字开始(这不同于许多其它的数据库系统!)。但一个名字不能 仅仅 以数字组成。

  * 不能在名字中使用 “.” 字符,因为它是用于扩充格式的,你可以用它引用列(见下面)。

  建议不要使用象 1e 这样的名字,因为一个表达式 1e+1 是存在二义性的。它可以被解释为表达式 1e + 1 或数字 1e+1。

  在 MySQL 中,你可以使用下列表格中的任一种方式引用一个列:

  列引用 含义

  col_name 列 col_name 来自查询所用的任何一个表中对应字段

  tbl_name.col_name 列 col_name 来自当前数据库中的表 tbl_name

  db_name.tbl_name.col_name 列 col_name 来自数据库 db_name 中的表 tbl_name。这个形式从 MySQL 3.22 或以后版本开始可用。

  `column_name` 该字段是一个关键词或包含特殊字符。

  在一条语句中的列引用中,不需要明确指定一个 tbl_name 或 db_name.tbl_name 前缀,除非这个引用存在二义性。例如,假设表 t1 和 t2 均包含一个字段 c,当用一个使用了 t1 和 t2 的 SELECT 检索 c 时。在这种情况下,c 存在二义性,因为它在这个语句所使用的表中不是唯一的,因而必须通过写出 t1.c 或 t2.c 来指明你所需的是哪个表。同样的,如果从数据库 db1 的表 t 和数据库 db2 的表 t 中检索,你必须用db1.t.col_name 和 db2.t.
CopyRight © 2012 站长网 编程知识问答 www.zzzyk.com All Rights Reserved
部份技术文章来自网络,