mysql - 使用通配符在 MySQL 中搜索反斜杠时执行 LIKE 时的奇怪行为

标签 mysql sql database

我在使用 MySQL 时遇到了一个非常不寻常的问题,涉及反斜杠。基本上,当我用 LIKE 对数据库中作为文本而不是实际换行符的\n 进行通配符匹配时,如果我只有一个右手通配符,它​​只会返回一个匹配项:

SELECT * 
FROM  `tmptest` 
WHERE  `a` LIKE  '\\\\n%'

现在,如果我这样查询,它不会返回任何东西:

SELECT *  
FROM `tmptest` 
WHERE `a` LIKE '%\\\\n%'

从我在表中的数据可以看出,这两个查询应该是匹配的。我不确定它是否是我遗漏的东西,或者我错误地转义了换行符,但对于第一个查询工作而第二个查询不工作没有意义。

表结构:

CREATE TABLE IF NOT EXISTS `tmptest` (
`a` varchar(22) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;

示例数据:

INSERT INTO `tmptest` (`a`) VALUES
('\\n'),
('\\n\\ndfsdfsdfs\\n');

感谢您花时间阅读本文。

最佳答案

在使用左侧通配符时,它适用于 6 反斜杠:

mysql> SELECT * FROM `tmptest` WHERE `a` LIKE '%\\\\\\n%';
+-----------------+
| a               |
+-----------------+
| \n              |
| \n\ndfsdfsdfs\n |
+-----------------+
2 rows in set (0.00 sec)

使用 mysqld 版本 5.1.49


@Karolis 据我所知,LIKE 运算符的表达式应该被解析两次,因此 \\\\ 变成 \与 LIKE 一起使用时。

但是如何解释这个(使用表达式“back\slash”):

SELECT 'back\\slash' LIKE '%back\\\\slash%'; -> TRUE(正常行为)

SELECT 'back\\slash' LIKE '%back\\\\\slash%'; -> TRUE(5 个反斜杠?)

SELECT 'back\\slash' LIKE '%back\\\\\\slash%'; -> TRUE(6 个反斜杠?)

SELECT 'back\\slash' LIKE '%back\\\\\\\slash%'; -> TRUE(7 个反斜杠?)

SELECT 'back\\slash' LIKE '%back\\\\\\\\slash%'; -> FALSE(正常行为,我猜......)

然而,如果只搜索“\”:

mysql> SELECT 'back\\slash' LIKE '%\\\\%'; --> FALSE(但应该有效)

mysql> SELECT 'back\\slash' LIKE '%\\\\\%'; --> TRUE(5 个反斜杠)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\%'; --> TRUE(6 个反斜杠)

mysql> SELECT 'back\\slash' LIKE '%\\\\\\\%'; --> FALSE(7 个反斜杠)

对于这个特定的问题,可以使用不同的转义字符 | 并完全绕过该问题(如果没有出现 | 字符):

mysql> SELECT 'back\\slash' LIKE '%\\%' ESCAPE '|'; --> TRUE

所以也许一些 mysql 大师可以解释这一点。我根本做不到。还在另一台机器上用 mysql 5.1.53 进行了测试。观察到相同的行为。当我开始评论时,这是一个相当有趣的问题。

关于mysql - 使用通配符在 MySQL 中搜索反斜杠时执行 LIKE 时的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7596801/

相关文章:

mysql - 如果在实体中添加或删除列,则使缓存(2LD 缓存 Hibernate)无效。 (雷迪森)

mysql - 有没有办法在 mysql 语句中分解单元格值

mysql - SQL Select语句构造

php - 生成 .sql 文件并使用 php 执行查询

sql - 在 MySQL 中创建分类表

mysql - 关于 SQL 查询,什么被认为是缓慢的?

Mysql 将列拆分为 3 列以便在 phpMyAdmin 中查看

php - mysqli_result 值到 php 中的变量

c# - 如何编写一列返回多个结果的SQL查询C#

SQL Oracle : Replace an empty result with word