Mysql 字符串字面值

来自泡泡学习笔记
跳到导航 跳到搜索

字符串字面值是由单引号(’)或双引号(“)括起来的一系列字节或字符。例如:

'a string'
"another string"


相邻的引号字符串会连接成一个字符串。下面的几行是等价的:

'a string'
'a' ' ' 'string'


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


二进制字符串是一系列字节。每个二进制字符串都有一个名为binary的字符集和排序规则。非二进制字符串是一系列字符。它具有不同于binary的字符集和与字符集兼容的排序规则。


对于这两种类型的字符串,比较是基于字符串单元的数值值进行的。对于二进制字符串,单元是字节;比较使用数值字节值。对于非二进制字符串,单元是字符,并且某些字符集支持多字节字符;比较使用数值字符编码值。字符编码顺序是字符串排序规则的一个功能。

注意 在mysql客户端中,二进制字符串以十六进制表示,取决于–binary-as-hex选项的值。


字符字符串字面值可以具有可选的字符集引导符和COLLATE子句,以指定使用特定字符集和排序规则的字符串:

[_charset_name]'string' [COLLATE collation_name]


例如:

SELECT _latin1'string';
SELECT _binary'string';
SELECT _utf8mb4'string' COLLATE utf8mb4_danish_ci;


您可以使用N’literal’(或n’literal’)创建一个使用国家字符集的字符串。下面的语句是等价的:

SELECT N'some text';
SELECT n'some text';
SELECT _utf8'some text';


在字符串中,除非启用了NO_BACKSLASH_ESCAPES SQL模式,否则某些序列具有特殊含义。这些序列以反斜杠()开头,称为转义字符。对于不在表中的所有其他转义序列,反斜杠将被忽略。也就是说,转义字符被解释为未转义的字符。例如,。这些序列是区分大小写的。例如,,但。转义处理根据character_set_connection系统变量指示的字符集进行。

转义序列 序列表示的字符
\0 ASCII的空字符(X’00’)
\' 单引号(’)字符
\" 双引号(“)字符
\b 退格字符
\n 换行(换行符)字符
\r 回车字符
\t 制表符
\Z ASCII 26(Control+Z)
\\ 反斜杠()字符
\% %字符
\_ _字符

ASCII 26字符可以编码为,以使您能够解决ASCII 26在Windows上表示END-OF-FILE的问题。如果文件中存在ASCII 26,如果不进行转义,则会引起问题,因为在Windows上,Control+Z可能被视为END-OF-FILE。


在编写应用程序时,任何可能包含特殊字符的字符串在将该字符串用作发送到MySQL服务器的SQL语句中的数据值之前,必须进行适当的转义。有两种方法可以做到这一点:

  • 使用转义特殊字符的函数处理字符串。在C程序中,可以使用mysql_real_escape_string_quote() C API函数来转义字符。在构造其他SQL语句的SQL语句中,可以使用QUOTE()函数。Perl DBI接口提供了一个quote方法,将特殊字符转换为适当的转义序列。
  • 作为显式转义特殊字符的替代方法,许多MySQL API提供了一个占位符功能,使您可以在语句字符串中插入特殊标记,然后在发出语句时将数据值绑定到它们。在这种情况下,API会为您转义值中的特殊字符。