暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

MySQL的语言结构 - 字面量 - 字符串字面量

数据库杂货铺 2021-05-06
1160
字符串字面量
 
字符串是字节或字符的序列,用单引号 (') 或双引号 (") 字符括起来。示例:
 
    'a string'
    "another string"
    复制
     
    相邻放置的带引号的字符串连接成单个字符串。以下行是等效的:
     
      'a string'
      'a' ' ' 'string'
      复制
       
      如果启用了 ANSI_QUOTES SQL 模式,则只能在单引号内引用字符串字面量,因为在双引号内引用的字符串将被解释为标识符。
       
      二进制字符串是字节字符串。每个二进制字符串都有一个名为 binary 的字符集和排序规则。非二进制字符串是字符组成的字符串。它有一个不同于 binary 的字符集和一个与字符集兼容的排序规则。
       
      对于这两种类型的字符串,比较都基于字符串单位的数值。对于二进制字符串,单位是字节;比较使用数字字节值。对于非二进制字符串,单位是字符,某些字符集支持多字节字符;比较使用数字字符代码值。字符代码排序是字符串排序规则的函数。
       
      字符字符串字面量可以具有可选的字符集导入和 COLLATE 子句,以将其指定为使用特定字符集和排序规则的字符串:
       
        [_charset_name]'string' [COLLATE collation_name]
        复制
         
        示例:
         
          SELECT _latin1'string';
          SELECT _binary'string';
          SELECT _utf8'string' COLLATE utf8_danish_ci;
          复制
           
          可以使用 N'literal'(或 n'literal')创建国际字符集的字符串。以下这些语句是等价的:
           
            SELECT N'some text';
            SELECT n'some text';
            SELECT _utf8'some text';
            复制
             
            在字符串中,某些序列具有特殊的含义,除非启用了 NO_BACKSLASH_ESCAPES SQL 模式。这些序列都以反斜杠(\)开始,称为转义字符。MySQL 识别下表“特殊字符转义序列”中所示的转义序列。对于所有其他转义序列,将忽略反斜杠。也就是说,转义字符按照没有转义解释。例如,\x 就是 x。这些序列区分大小写。例如,\b 被解释为退格,但是 \B 被解释为 B。转义处理是根据 character_set_connection 系统变量所指示的字符集来完成的。即使字符串前面有表示不同字符集的导入也是如此。
             
            特殊字符转义序列
             
             
            转义序列
            序列表示的字符
            \0
            一个 ASCII NUL (X'00') 字符
            \'
            单引号 (') 字符
            \"
            双引号 (") 字符
            \b
            退格字符
            \n
            换行符
            \r
            回车符
            \t
            制表符
            \Z
            ASCII 26(Control+Z)
            \\
            反斜杠 (\) 字符
            \%
            % 字符
            \_
            _ 字符
             
            ASCII 26 字符可以编码为 \Z,以便能够解决 ASCII 26 Windows 上代表 END-OF-FILE 的问题。如果试图使用 mysql db_name < file_name,文件中的 ASCII 26 会导致问题。
             
            \% \_ 序列用于在模式匹配上下文中搜索 % _ 的文本实例,否则它们将被解释为通配符。如果在模式匹配上下文之外使用 \% \_,则它们的计算结果为字符串 \% \_,而不是 % _
             
            有几种方法可以在字符串中包含引号字符:
             
            ● 用 ' 引用的字符串中的 ' 可以写为 ''
             
            ● 用 " 引用的字符串中的 " 可以写为 ""
             
            ● 在引号前面加一个转义符(\)。
             
            ● 用 " 引用的字符串中的 ' 不需要特殊处理,也不需要写两个或转义。同样地,用 ' 引用的字符串中的 " 也不需要特殊处理。
             
            以下 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 |
              +--------------------+

              mysql> SELECT 'disappearing\ backslash';
              +------------------------+
              | disappearing backslash |
              +------------------------+
              复制
               
              要将二进制数据插入到字符串列(例如 BLOB 列)中,应该用转义序列表示某些字符。反斜杠(\)和用于引用字符串的引号字符必须转义。在某些客户端环境中,可能还需要转义 NUL Control+Z。如果没有转义,mysql 客户端将截断包含 NUL 字符的带引号字符串,如果没有转义,Control+Z 可能会作为 Windows 上的 END-OF-FILE 对待。
               
              在编写应用程序时,在将任何可能包含这些特殊字符的字符串用作发送到 MySQL 服务器的 SQL 语句中的数据值之前,必须对其进行正确的转义。可以通过两种方式完成此操作:
               
              ● 使用能够对特殊字符转义的函数处理字符串。在 C 程序中,可以使用 mysql_real_escape_string_quote() C API 函数对字符进行转义。在 SQL 语句中,可以使用 QUOTE() 函数。Perl DBI 接口提供了一个 quote 方法来将特殊字符转换为正确的转义序列。其他语言接口也可以提供类似的功能。
               
              ● 作为显式转义特殊字符的替代方法,许多 MySQL API 提供了占位符功能,使您能够在语句字符串中插入特殊标记,然后在执行语句时将数据值绑定到它们。这种情况下,API 负责转义值中的特殊字符。
               
               
              官方文档:
              https://dev.mysql.com/doc/refman/8.0/en/string-literals.html
               
              文章转载自数据库杂货铺,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

              评论