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 会自动为你从数值中转换它们。
燕子去了,有再来的时候;杨柳枯了,有再青的时候;桃花谢了,有再开的时候。但是,聪明的,你告诉我,我们的日子为什么一去不复返呢?——是有人偷了他们罢:那是谁?又藏在何处呢?是他们自己逃走了罢:现在又到了哪里呢?