出于某种原因,使用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不是最好的。
答案 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);