Ada*_*dam 7 mysql sql database
我遇到了一个非常不寻常的MySQL问题,涉及反斜杠.基本上,当我使用LIKE进行通配符匹配时,\n在数据库中作为文本而不是实际的换行符,如果我只有一个右手通配符,它将只返回一个匹配:
SELECT *
FROM `tmptest`
WHERE `a` LIKE '\\\\n%'
Run Code Online (Sandbox Code Playgroud)
现在,如果我这样查询,它将不会返回任何内容:
SELECT *
FROM `tmptest`
WHERE `a` LIKE '%\\\\n%'
Run Code Online (Sandbox Code Playgroud)
正如您从表中的数据中看到的,两个查询都应该匹配.我不确定这是否是我遗漏的东西,或者我错误地转换了换行符,但是第一个查询无效,第二个查询没有意义.
表结构:
CREATE TABLE IF NOT EXISTS `tmptest` (
`a` varchar(22) CHARACTER SET utf8 COLLATE utf8_unicode_ci NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8;
Run Code Online (Sandbox Code Playgroud)
样本数据:
INSERT INTO `tmptest` (`a`) VALUES
('\\n'),
('\\n\\ndfsdfsdfs\\n');
Run Code Online (Sandbox Code Playgroud)
感谢您花时间阅读本文.
使用左侧通配符时,它对我有6个反斜杠:
mysql> SELECT * FROM `tmptest` WHERE `a` LIKE '%\\\\\\n%';
+-----------------+
| a |
+-----------------+
| \n |
| \n\ndfsdfsdfs\n |
+-----------------+
2 rows in set (0.00 sec)
Run Code Online (Sandbox Code Playgroud)
使用mysqld Ver 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 '%\\\\%'; - >假(但应该工作)
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 '|'; - >正确
所以也许一些mysql大师可以解释这个.我根本不能.还在另一台机器上使用mysql 5.1.53进行了测试.观察到相同的行为.正如我从评论开始,这是一个相当有趣的问题.
| 归档时间: |
|
| 查看次数: |
1129 次 |
| 最近记录: |