实用pgsql小知识

1.美元符界定字符串常量

在pgsql中如果在字符串序列中包含有'(单引号),那么应当将'(单引号)加倍为''(两个单引号)否则sql语句很可能无法执行。

如果字符串中包含很多单引号或者反斜杠,那么理解字符串的内容可能就会变得很苦涩,并且容易出错,因为单引号都要加倍。

为了让这种场合下的查询更具可读性,Postgresql 允许另外一种称作"美元符界定"的字符串常量书写办法。一个通过美元符界定声明的字符串常量由一个美元符号($)、零个或多个字符组成的"记号"、另一个美元符号、组成字符串常量的任意字符序列、一个美元符号、与前面相同的记号、一个美元符号组成的。比如,下面是两个不同的用美元符界定的方法声明"Dianne's horse"的例子:

$$Dianne's horse$$
$SoMetag$Dianne's horse$SoMetag$
一个美元符界定的字符串里,字符串内容总是按照字面内容书写。反斜杠不是特殊的、美元符自己也不是特殊的(除非它们和开标签的一部分匹配)。

我们可以通过在不同嵌套级别使用不同的"标记"来实现嵌套。最常见的是写函数定义的时候。比如:

$function$
BEGIN
    RETURN ($1 ~ $q$[\t\r\n\v\\]$q$);
END;
$function$

这里,序列$q$[\t\r\n\v\\]$q$表示一个美元符界定的字符串文本[\t\r\n\v\\],在函数体被 Postgresql 执行的时候,它将被识别出来。但是因为这个序列不匹配外层的界定符$function$,所以只要考虑了外层字符串,它就只是常量里面的普通字符而已。

如果有标签的话,一个美元符界定的字符串遵循和无引号包围的标识符相同的规则,只是它不能包含美元符。标签是大小写相关的,因此$tag$String content$tag$是正确的,而$TAG$String content$tag$则是错误的。

一个后面紧跟着关键字或者标识符的美元符界定字符串必须用空白与其后的关键字或者标识符隔开;否则美元符界定符将会被当作标识符的开头部分([原文] otherwise the dollar quoting delimiter would be taken as part of the preceding identifier)。

美元符界定不是 sql 标准,但是在写复杂的字符串文本的时候,它通常比标准的单引号语法更方便。尤其是在其它常量里表现字符串常量的时候更有用。比如在过程函数定义里,如果用单引号语法,每个上面例子里的每个反斜杠都必须写四个,它们在作为字符串文本分析的时候会减少为两个,然后在函数执行的时候在内层字符串常量里会再次被解析为一个

相关文章

项目需要,有个数据需要导入,拿到手一开始以为是mysql,结果...
本文小编为大家详细介绍“怎么查看PostgreSQL数据库中所有表...
错误现象问题原因这是在远程连接时pg_hba.conf文件没有配置正...
因本地资源有限,在公共测试环境搭建了PGsql环境,从数据库本...
wamp 环境 这个提示就是说你的版本低于10了。 先打印ph...
psycopg2.OperationalError: SSL SYSCALL error: EOF detect...