mysql - 为什么我需要双重转义(使用 4\)来查找纯 SQL 中的反斜杠(\)?

标签 mysql select escaping sql-like backslash

我不明白这个 MySQL 行为:如果我想显示 a\b,我可以只选择 "a\\b" 没有问题:

mysql> select "a\\b";
+-----+
| a\b |
+-----+
| a\b |
+-----+
1 row in set (0.05 sec)

但是如果我想使用 LIKE 在表中搜索包含\的字符串,我需要对“\”进行两次转义。为什么?

这是一个例子。

我们准备了一张小 table 。

create table test ( test varchar(255) );
insert into test values ( "a\\b" ) , ( "a\\b\\c" ) , ( "abcd" );

mysql> select * from test;
+-------+
| test  |
+-------+
| a\b   |
| a\b\c |
| abcd  |
+-------+
3 rows in set (0.05 sec)

我们尝试获取以“a\b”开头的条目...

mysql> select * from test where test LIKE "a\\b%";
+------+
| test |
+------+
| abcd |
+------+
1 row in set (0.05 sec)

为什么 \\ 在那里被忽略了?为什么我需要两次转义 basckslash 以获得预期结果?

mysql> select * from test where test LIKE "a\\\\b%";
+-------+
| test  |
+-------+
| a\b   |
| a\b\c |
+-------+
2 rows in set (0.04 sec)

最佳答案

首先对字符串语法进行转义,然后对 LIKE 语法进行转义。

LIKE 中,字符 %_ 有特殊含义,所以如果你想搜索文字 % ,你需要使用 \%,如果你想搜索文字 \% 你需要像 \\% 一样转义反斜杠.

在字符串语法中 " 显然有特殊的含义,所以如果你想在字符串中包含引号,你需要将它转义为 \",并包含文字 \" 在字符串中,您必须像在 \\" 中那样转义反斜杠。

所以在这两种语法中你都必须转义\


如果你不想使用 \ 来转义 LIKE 模式,你可以使用 ESCAPE 关键字。例如:

...  where test LIKE "a\\b%" ESCAPE '|';

这样,您需要编写 |%|_|| 来转义这些特殊字符。

关于mysql - 为什么我需要双重转义(使用 4\)来查找纯 SQL 中的反斜杠(\)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13414791/

相关文章:

mysql - 我可以执行 `select * from table where id in (<string from another query>)

sql - 如何回显批处理文件中的特殊字符?

mysql - 在 bash 脚本中转义 mysql 引号

php - MySQL 查询帮助 : Getting content from associated table with position

mysql - 将现有数据库迁移到 Amazon RDS

mysql - Django 南 : Changing the type of primary key of existing table which are referenced by FK

java - 在java中将国际字符串转换为\u代码

mysql - 在 Laravel 中使用谷歌地图和 mysql 进行半径搜索

mysql - 标记文章选择 - 更复杂的情况(由逻辑表达式定义的标记)

MYSQL删除每个GROUP超过15条的所有记录