扩展字符串字面量

语法

E'characters'

参数

您可以采用扩展字符串字面量的 C 样式反斜杠序列,这是结构化查询语言 (SQL) 标准的扩展。您可以通过将字母 E 作为前缀(在开放的单引号前)来指定一个扩展字符串字面量;例如:

E'extended character string\n'

在扩展字符串内,反斜杠字符 (\\) 启动 C 样式反斜杠序列,在该序列中反斜杠组合和后面的字符或数字代表一个特别的字节值,如下表所示:任何后接反斜杠的字符都按字面理解;例如,要包含一个反斜杠字符,就输入两个反斜杠 (\\\)。

  • \\\ 是一个反斜杠

  • \b 是一个退格符

  • \f 是一个换页符

  • \n 是一个换行符

  • \r 是一个回车符

  • \t 是一个制表符

  • \x##,其中 ## 是 1 位或 2 位十六进制数;例如 \x07 是一个制表符

  • \\###,其中 ### 是 1、2 或 3 位八进制数,表示带有相应代码的字节。

当扩展的字符串字面量衔接起来跨过线时,只在首个开放的引号前输入 E

=> SELECT E'first part o'
    'f a long line';
         ?column?
---------------------------
 first part of a long line
(1 row)

将两个相邻的单引号作为一个单引号使用:

=> SELECT 'Aren''t string literals fun?';
          ?column?
-----------------------------
 Aren't string literals fun?
(1 row)

符合标准的字符串和转义字符

解释命令(例如,在 vsql 中输入的命令,或者在通过 JDBC 或 ODBC 传递的查询中输入的命令)时,Vertica 采用 SQL 标准中指定的符合标准的字符串。在符合标准的字符串中,反斜杠视作字符串字面量(普通字符),而非转义字符。

可以按照以下内容操作,但是 Vertica 建议您在发生警告后尽快使用符合标准的字符串移动您的应用程序。

  • 要将反斜杠视为转义字符,请将配置参数 StandardConformingStrings 设置为 0。

  • 要永久启用符合标准的字符串,请将 StandardConformingStrings 参数设置为 '1',如下面所述。

  • 要使每一会话均为符合标准的字符串,采用设置符合标准的字符串为开启,此设置只有在当前会话将反斜杠视为转义字符。

识别不符合标准的字符串

以下程序可以用于识别您的应用程序中不符合标准的字符串,从而您可以将这些字符串转换为符合标准的字符串:

  1. 确保 StandardConformingStrings 参数处于关闭状态,如国际化参数中所述。

    => ALTER DATABASE DEFAULT SET StandardConformingStrings = 0;
    
  2. 如有必要,请打开 EscapeStringWarning 参数。

    => ALTER DATABASE DEFAULT SET EscapeStringWarning = 1;
    

    目前,Vertica 每次在字符串字面量中遇到一个转义字符串时都会返回一项警告。例如,Vertica 在下面的示例中将 \n 解释为换行符:

    => SELECT 'a\nb';
       WARNING:  nonstandard use of escape in a string literal at character 8
       HINT:  Use the escape string syntax for escapes, e.g., E'\r\n'.
     ?column?
    ----------
     a
    b
    (1 row)
    

    StandardConformingStringsON 时,该字符串解释为四个字符:a \ n b

    通过扩展由 Vertica 标记的每个字符来对其进行修改,如以下示例中所示:

    E'a\nb'
    

    或者如果该字符串已经引用了单引号,那么使用两个单引号,例如, 'one'' double'.

  3. 为全部会话开启 StandardConformingStrings 参数:

    => ALTER DATABASE DEFAULT SET StandardConformingStrings = 1;
    

两个单引号

这节内容讨论不传递给服务器的 vsql 输入值。 Vertica 将一个字符串字面量中两个连续的单引号视为一个单引号符。例如以下输入,'You''re here!' 忽略了第二个连续引号并返回以下内容:

=> SELECT 'You''re here!';
   ?column?
--------------
 You're here!at
(1 row)

这就是 SQL 标准表示法,且在表格中多见,'You\\'re here!',因为反斜杠和之前的解析不同。您需要忽略掉反斜杠:

=> SELECT (E'You\'re here!');
   ?column?
--------------
 You're here!
(1 row)

此更改行为在使用 vsql meta-command \set 时引进一个潜在的不兼容性,这会自动将其命令行实参衔接起来。例如:

\set file  '\''  'pwd'  '/file.txt'  '\''\echo :file

vsql 接受这四个参数并输出以下内容:

'/home/vertica/file.txt'

Vertica 按如下方式解析相邻的单引号:

\set file  '\'''pwd''/file.txt''\''\echo :file
'/home/vertica/file.txt''

注意末尾额外的单引号。这是因为相邻的单引号与引用反斜杠的单引号进行了配对。

额外的引号可以被解析为上面的第一个案例或是将字面意义进行组合,如下:

\set file '\''`pwd`'/file.txt'''\echo :file
'/home/vertica/file.txt'

在这两种情况中,引用反斜杠的单引号应该改为两个单引号,如下:

\set file '''' `pwd` '/file.txt'''

其他示例

=> SELECT 'This \is a string';
     ?column?
------------------
 This \is a string
(1 row)

=> SELECT E'This \is a string';
     ?column?
------------------
 This is a string

=> SELECT E'This is a \n new line';
       ?column?
----------------------
 This is a
 new line
(1 row)

=> SELECT 'String''s characters';
      ?column?
--------------------
 String's characters
(1 row)