MySQL REPLACE影响0行,但WHERE ... LIKE返回90

时间:2016-09-19 22:14:11

标签: mysql sql phpmyadmin

出于某种原因,使用PhpMyAdmin时运行时返回90行:

SELECT COUNT(*) 
FROM le_wp_posts 
WHERE post_content LIKE '%Â%'

但以下仅更新3行:

UPDATE le_wp_posts 
SET post_content = REPLACE(post_content, 'Â', '') 
WHERE post_content LIKE '%Â%'

我也试过省略WHERE语句中的UPDATE子句。是否有任何明显的原因我忽略了导致这个问题的原因?或者我可以采取哪些步骤来调查原因?我的SQL不是最好的。

8 个答案:

答案 0 :(得分:3)

我做了以下测试......

1)创建一个包含一些数据的表:

create table test(col varchar(10));

insert into test values ('abc'), ('dbe');

2)使用相同的过滤器(但不同的字符)选择行数:

select count(*)
from test
where col like '%B%' -- note the uppercase
;

得到以下结果:

+----------+                                                                                                                                                                
| count(*) |                                                                                                                                                                
+----------+                                                                                                                                                                
|        2 |                                                                                                                                                                
+----------+ 

1 row in set

3)尝试了更新:

update test 
set col = replace(col, 'B', '') -- note the uppercase
where col like '%B%' -- note the uppercase
;

得到了这个结果:

Query OK, 0 rows affected (0.01 sec)                                                                                                                                        
Rows matched: 2  Changed: 0  Warnings: 0

就我而言,在表创建时使用默认字符集和排序规则。默认字符集是' latin1'和整理' latin1_swedish_ci'。请注意排序结束时的ci ....这意味着不区分大小写。因此,LIKE过滤器执行不区分大小写的搜索,找到2行,但REPLACE函数(如文档中所示)区分大小写。可能,就像在我的情况下,更新找到与select中相同的行数,但由于REPLACE上的大小写限制而更新了更少的数据。

如果这是你的问题,你不能只运行两个更新,一个用于大写,一个用于小写?我将尝试在一次更新中开发解决方案......

关于REPLACE(str, from_str, to_str)函数的docs

  

返回字符串str,其中所有出现的字符串from_str都替换为字符串to_str。 REPLACE()在搜索from_str时执行区分大小写的匹配。

关于LIKE运营商的docs

  

以下两个语句说明字符串比较不区分大小写,除非其中一个操作数区分大小写(使用区分大小写的排序规则或是二进制字符串):

第一个例子:

mysql> SELECT 'abc' LIKE 'ABC';
        -> 1

第二个例子:

mysql> SELECT 'abc' LIKE _latin1 'ABC' COLLATE latin1_general_cs;
        -> 0

注意整理结束时的cs。这意味着区分大小写

答案 1 :(得分:3)

如果您使用utf8编码的£C2A3,将其视为utf8)并将其存储到latin1列中,当您将其读回时,您会获得£({{ 1}},被视为latin1)。删除C2A3将适用于大约32个字符,但对于许多其他字符将失败。 它会让桌子更难修复!

让我们看一下您尝试存储的内容的示例,以及最终在表中的Â。另外,让我们看一下HEX,以确认我怀疑目标是SHOW CREATE TABLE

This讨论了latin1调试技术。它讨论了“最佳实践”,其中包括在连接过程中声明你真的有utf8,而不是latin1。它谈到了“Mojibake”,其中HEX转变为ñ,让ñ成为一个混乱的前景。

REPLACE的症状与字符集不匹配一致。

答案 2 :(得分:2)

LIKE不区分大小写,但Replace是区分大小写的,绕过它使用以下查询:

UPDATE le_wp_posts 
SET post_content = REPLACE(LOWER(post_content), LOWER('Â'), '') 
WHERE post_content LIKE '%Â%'

或者,如果您希望最终结果不是小写:

UPDATE le_wp_posts 
SET post_content = REPLACE(REPLACE(post_content, LOWER('Â'), ''), 'Â', '') 
WHERE post_content LIKE '%Â%'

答案 3 :(得分:1)

--you just need to put N before string pattern too (if you want look for unicode char)*/
Update le_wp_posts
Set post_content=REPLACE(post_content,N'Â','')
where post_content like '%Â%'

答案 4 :(得分:0)

请按以下方式尝试使用JOIN:

UPDATE le_wp_posts l
INNER JOIN (SELECT t.post_content  
            FROM le_wp_posts t 
            WHERE t.post_content LIKE '%Â%') t ON l.post_content = t.post_content
SET l.post_content = REPLACE(l.post_content, 'Â', '')

答案 5 :(得分:0)

如果您有“身份证明”,可以尝试这种方式:

{{1}}

答案 6 :(得分:0)

我想更新不是从PhpMyAdmin中发生的,而是从客户端发生的? 如果是这样,那就是不同的区域设置。

答案 7 :(得分:0)

$ionicLoading.show();
$timeout(function () {
  //execute all the expensive things that would grind the default spinner to a halt!
}, 200).then($ionicLoading.hide);