我试图弄清楚为什么这两个类似的语句被同等地评估。首先,我进行了一个简单的选择,返回 22 行。在第二个中,我期望我的更新/替换也应该返回受影响的 22 行。有人能看到我做错了什么吗?这些应该匹配诸如“I got a knee mri”之类的字符串。
SET @acro = 'mri';
SELECT title FROM mytable WHERE title LIKE concat('% ', @acro);
//返回n行
UPDATE mytable
SET title = REPLACE(title, CONCAT(' ', @acro), CONCAT(' ', UPPER(@acro)))
WHERE title LIKE CONCAT('% ', @acro);
//返回0行
CREATE TABLE `mytable` (
`id` int(11) unsigned NOT NULL AUTO_INCREMENT,
`title` text,
`author` varchar(50) DEFAULT NULL,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=119232 DEFAULT CHARSET=utf8;
最佳答案
“受影响的行数”计数是已修改的行数,而不是匹配的行数。
一种解释是列标题使用不区分大小写的排序规则,即名称以 _ci
结尾的字符集。
可能有 22 行“匹配”,但不需要修改任何行。
如果该列是使用字符集/排序规则 latin1_swedish_ci
定义的,您可以尝试比较如下查询的结果:
SET @acro = _latin1'mri';
SELECT title
FROM mytable
WHERE title COLLATE latin1_general_cs LIKE UPPER(CONCAT('% ', @acro));
^^^
关于MySQL LIKE 匹配字符串末尾,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26352874/