字符串字面量是使用单引号或双引号引用的字符串值。双引号字符串需使用反斜杠,单引号字符串则不要求使用反斜杠,但 \\'
和 \\\
除外。
您可以将单引号和反斜杠嵌入单引号字符串。
如需包含其他反斜杠(转义)序列,例如 \t
(Tab),您必须使用双引号形式。
对于单引号字符串,在字符串和其前面的词语之间必须加入空格,因为单引号允许用于标识符。
字符串字面量是使用单引号或双引号引用的字符串值。双引号字符串需使用反斜杠,单引号字符串则不要求使用反斜杠,但 \\'
和 \\\
除外。
您可以将单引号和反斜杠嵌入单引号字符串。
如需包含其他反斜杠(转义)序列,例如 \t
(Tab),您必须使用双引号形式。
对于单引号字符串,在字符串和其前面的词语之间必须加入空格,因为单引号允许用于标识符。
字符字符串字面量是由预定义字符集中的字符组成的序列,两边加上单引号。
'character-seq'
如果字符字符串字面量包含单引号,则必须成对出现。例如:
=> SELECT 'Chester''s gorilla';
?column?
-------------------
Chester's gorilla
(1 row)
Vertica 按照 SQL 标准中指定的要求,使用符合标准的字符串,将反斜杠处理为字符串字面量,而不是处理为转义字符。
=> SELECT 'This is a string';
?column?
------------------
This is a string
(1 row)
=> SELECT 'This \is a string';
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?
------------------
This is a string
(1 row)
vmartdb=> 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)
以美元为界的字符串字面量很少使用,但为了方便起见,在此处提供了这种文本。
用来指定字符串字面量的标准语法可能很难理解。在这种情况下,为了提高查询的可读性,Vertica SQL 提供了美元界限。美元界限不是 SQL 标准的一部分,但它通常用来编写复杂的字符串字面量,比符合标准的单引号语法更方便。
$$characters$$
以美元为界的字符串内容被视为字面量。在以美元为界的字符串中,单引号、反斜杠和美元符号字符中没有特殊含义。
关键字或标识符后面以美元为界的字符串必须与前面的单词用空格分隔;否则,美元界限分隔符将作为前面标识符的一部分。
=> SELECT $$Fred's\n car$$;
?column?
-------------------
Fred's\n car
(1 row)
=> SELECT 'SELECT 'fact';';
ERROR: syntax error at or near "';'" at character 21
LINE 1: SELECT 'SELECT 'fact';';
=> SELECT 'SELECT $$fact';$$;
?column?
---------------
SELECT $$fact
(1 row)
=> SELECT 'SELECT ''fact'';';
?column?
----------------
SELECT 'fact';
(1 row)
U&'characters' [ UESCAPE '<Unicode escape character>' ]
启用 StandardConformingStrings
时,Vertica 支持 SQL 标准 Unicode 字符字符串字面量(字符集为仅 UTF-8)。
在输入 Unicode 字符字符串字面量之前,请通过以下方式之一启用符合标准的字符串。
要为所有会话启用,请更新配置参数 StandardConformingStrings。
要在当前会话中将反斜杠视为转义字符,请使用 SET STANDARD_CONFORMING_STRINGS 语句。
另请参阅扩展的字符串字面量。
要以十六进制输入 Unicode 字符(例如 'thank you' 的俄语短语),请使用以下语法:
=> SET STANDARD_CONFORMING_STRINGS TO ON;
=> SELECT U&'\0441\043F\0430\0441\0438\0431\043E' as 'thank you';
thank you
-----------
спасибо
(1 row)
要以十六进制输入德语单词 mude
(其中 u
是变元音):
=> SELECT U&'m\00fcde';
?column?
----------
müde
(1 row)
=> SELECT 'ü';
?column?
----------
ü
(1 row)
要以十六进制输入 LINEAR B IDEOGRAM B240 WHEELED CHARIOT
:
=> SELECT E'\xF0\x90\x83\x8C';
?column?
----------
(wheeled chariot character)
(1 row)
您可以通过 VARBINARY 字符串字面量在字符串字面量中指定十六进制数字或二进制数字。
X''
B''
=> SELECT X'abcd';
?column?
----------
\253\315
(1 row)
=> SELECT B'101100';
?column?
----------
,
(1 row)
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 标准中指定的符合标准的字符串。在符合标准的字符串中,反斜杠视作字符串字面量(普通字符),而非转义字符。
要将反斜杠视为转义字符,请将配置参数
StandardConformingStrings
设置为 0。
要永久启用符合标准的字符串,请将 StandardConformingStrings
参数设置为 '1',如下面所述。
要使每一会话均为符合标准的字符串,采用设置符合标准的字符串为开启,此设置只有在当前会话将反斜杠视为转义字符。
以下程序可以用于识别您的应用程序中不符合标准的字符串,从而您可以将这些字符串转换为符合标准的字符串:
确保 StandardConformingStrings
参数处于关闭状态,如国际化参数中所述。
=> ALTER DATABASE DEFAULT SET StandardConformingStrings = 0;
如有必要,请打开 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)
当 StandardConformingStrings
为 ON
时,该字符串解释为四个字符:a \ n b
通过扩展由 Vertica 标记的每个字符来对其进行修改,如以下示例中所示:
E'a\nb'
或者如果该字符串已经引用了单引号,那么使用两个单引号,例如, 'one'' double'.
为全部会话开启 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)