VastbaseG100

基于openGauss内核开发的企业级关系型数据库。

Menu

逃逸字符为反斜线时需要双写

背景信息

Vastbase G100支持使用SQL LIKE操作符实现模式匹配。通过LIKE语法来判断字符串是否能匹配上LIKE后的模式字符串。如果字符串与提供的模式匹配,则LIKE表达式返回为真,否则返回为假。

当LIKE中要查询特殊字符“%”、“_”、“\”的时候需要使用反斜杠“\”来进行转义。

在进行模糊匹配时:

  • 下划线“_”代表(匹配)任何单个字符;百分号“%”代表任意串的通配符。
  • 如果要匹配文本里的下划线或者百分号,在提供的模式里相应字符必须前导逃逸字符。逃逸字符的作用是禁用元字符的特殊含义,缺省的逃逸字符是反斜线“\”,也可以用ESCAPE子句指定一个不同的逃逸字符。
  • 要匹配逃逸字符本身,需要写两个逃逸字符。例如要写一个包含反斜线的模式常量,需要在SQL语句里写两个反斜线。

更多模式匹配的相关信息参见模式匹配操作符

功能描述

参数standard_conforming_strings用于控制普通字符串文本'…'中是否按照SQL标准把反斜线当成了普通文本。设置为off时,在文串常量中写的任何反斜线都需要被双写。因此,写一个匹配单个反斜线的模式实际上要在语句里写四个反斜线(可以通过用ESCAPE选择一个不同的逃逸字符来避免这种情况,这样反斜线就不再是LIKE的特殊字符了。但仍然是字符文本分析器的特殊字符,所以仍需要两个反斜线)。

注意事项

  • 除了反斜线双写的情况下,逃逸字符只能是单个字符。
  • 参数standard_conforming_strings的默认值为on。
  • 在兼容MySQL数据模式时,用户也可以通过写ESCAPE''的方式不选择逃逸字符,这样可以有效地禁用逃逸机制,但是没有办法关闭下划线和百分号在模式中的特殊含义。

示例

示例1:参数standard_conforming_strings为on时,逃逸字符为反斜线不用双写。

1、设置standard_conforming_strings参数值为on。

set standard_conforming_strings = on;

2、查看参数值是否设置成功。

show standard_conforming_strings;

返回结果为如下,设置成功。

 standard_conforming_strings
-----------------------------
 on
(1 row)

3、模糊查询,逃逸字符使用反斜线(反斜线不双写)。

SELECT '%A_BBCC' LIKE '\%A_B%' ESCAPE '\' AS RESULT;

返回结果为真,匹配成功。

 result
--------
 t
(1 row)

4、模糊查询,逃逸字符使用反斜线(反斜线双写)。

SELECT 'AA_BBCC' LIKE '\%A_B%' ESCAPE '\\' AS RESULT;

返回结果如下,逃逸字符不合法。

ERROR:  invalid escape string
HINT:  Escape string must be empty or one character.
CONTEXT:  referenced column: result

示例2:参数standard_conforming_strings为off时,在文串常量中写的任何反斜线都需要被双写。

standard_conforming_strings为off时,使用ESCAPE '\'的写法会有编译错误。

1、设置参数standard_conforming_strings的值为off。

set standard_conforming_strings to off;

2、查看参数值是否设置成功。

show standard_conforming_strings;

返回结果如下,设置成功。

 standard_conforming_strings
-----------------------------
 off
(1 row)

3、设置参数escape_string_warning 的值为off 。

set escape_string_warning = off ;

参数escape_string_warning打开时,如果在普通字符串文本'...'中出现了一个反斜线(\)并且standard_conforming_strings为off,那么就会发出一个警告。该参数默认值是on。

4、模糊查询,逃逸字符为反斜线。文串常量中写的任何反斜线都需要被双写。

SELECT '\A_BBCC' LIKE '\A%' ESCAPE '\\' AS RESULT;

返回结果为真,匹配成功。

 result
--------
 t
(1 row)