PostgreSQL中RAISE NOTICE语句里E'...'语法的含义与作用咨询
PostgreSQL中RAISE NOTICE语句里E'...'语法的含义与作用咨询
嘿,这个E'...'的用法我当初刚接触PostgreSQL的时候也困惑过,现在给你掰扯清楚!
其实这个E前缀和RAISE NOTICE本身没啥直接关系,它是PostgreSQL里转义字符串常量的标记,属于PostgreSQL对SQL标准的扩展语法。
咱们直接对比两种字符串写法的区别就明白了:
- 普通单引号字符串,比如
'msg %':里面的反斜杠\就是个普通字符,不会被当成转义符解析。比如你写'第一行\n第二行',输出的时候就是字面的"第一行\n第二行",不会真的换行。 - 带
E前缀的字符串,比如E'msg %':PostgreSQL会自动解析字符串里的转义序列,把它们转换成对应的特殊字符。常见的转义序列有这些:\n:换行符\t:制表符\':单引号(避免和字符串结束的单引号冲突)\\:字面的反斜杠(因为反斜杠本身是转义符,要输出它就得写两个)
回到你看到的例子,为啥有些教程里在RAISE NOTICE里用E'...'呢?其实如果你的消息文本里没有需要转义的内容,加不加E效果完全一样,比如RAISE NOTICE E'msg %', mymsg和RAISE NOTICE 'msg %', mymsg输出结果没啥区别。但如果消息里要用到特殊格式,比如换行,那加E就很有必要了:
-- 加E的话,\n会被解析成换行,输出分成两行 RAISE NOTICE E'报错啦:\n详细信息:%', error_details; -- 不加E的话,\n就是字面字符,输出一整行 RAISE NOTICE '报错啦:\n详细信息:%', error_details;
至于你提到的和GET STACKED DIAGNOSTICS一起用的场景,多半是因为这类错误消息里可能包含需要转义的特殊字符,或者开发者习惯统一用E前缀来处理字符串,所以才会频繁出现这种写法。
另外补充个小知识点:从PostgreSQL 9.1开始,你还可以用美元符引用的字符串(比如$$msg %$$)来替代E'...',这种写法不用处理转义,也不用转义单引号,但E前缀的写法在旧代码和教程里还是很常见的。
备注:内容来源于stack exchange,提问作者Randall
相关产品推荐
相关产品推荐

