MySQL在replace语句中将Must backout Treasury
匹配到52个不同的值。我不知道这怎么可能。那么,MySQL如何匹配对象?
我从英国替换为英国,并打印了不同的国家。它有效,但是我发现Must backout Treasury
作为一个国家存在错误。我去用NULL
替换了它,只是让MySQL用NULL
替换了所有Country值。
| 19 | 15:22:27 | UPDATE Trade SET country = REPLACE(country, "UK", "United Kingdom")
| 360 row(s) affected Rows matched: 23027 Changed: 360 Warnings: 0
我把东西放回去
| 20 | 15:22:39 | SET SQL_SAFE_UPDATES = 1
看看有什么变化;注意52个值
| 21 | 15:22:51 | SELECT DISTINCT(Country) FROM Trade
| 52 row(s) returned
并尝试替换这1个坏值
| 22 | 15:23:48 | SET SQL_SAFE_UPDATES = 0
| 23 | 15:23:48 | UPDATE Trade SET country = REPLACE(country, "Must backout Treasury", NULL)
| 9773 row(s) affected Rows matched: 23027 Changed: 9773 Warnings: 0 |
编辑:
好的,经过测试后,我可以确认您每次尝试REPLACE(Field, item, NULL)
时都会完全无视搜索和匹配,而是将NULL
放在字段中的每个值上。
所以,问题仍然存在,有人知道为什么会这样吗?
答案 0 :(得分:1)
因为REPLACE()
将输入字符串与值匹配。它检查输入字符串是否是字段值的子字符串,如果是,则将其替换为您的值。因此,当您尝试将UK
替换为United Kingdom
时,它将搜索数据中所有出现的UK
并将其全部替换。
使用WHERE
来指定故障记录并进行替换,而不是替换。
UPDATE Trade SET country=NULL WHERE country="Must backout Treasury"
或
UPDATE Trade SET country=NULL WHERE country LIKE "%Must backout Treasury%"
答案 1 :(得分:0)
在MySQL中,大多数涉及NULL
值的字符串操作最终将评估为NULL
。考虑到NULL
代表“我不知道它的价值”这一想法,这种行为是有意义的。
考虑:
SELECT CONCAT('abc',NULL)
返回NULL
。如果我将“未知”值附加到“ abc”,则结果将是“未知”。同样,
SELECT REPLACE('abc','d',NULL)
将“未知”值放入字符串中将导致“未知”值。因此,此表达式返回NULL
。 'd'
是否出现在'abc'
中都没关系。
通常,在将表达式合并到SELECT
语句中之前,我们先在UPDATE
语句中测试表达式。这样我们可以确认要匹配的行以及表达式的结果,例如
SELECT t.country
, REPLACE(t.country, 'Must backout Treasury', NULL) AS country_repl_null
, REPLACE(t.country, 'Must backout Treasury', '') AS country_repl_empty
FROM trade t
ORDER
BY ...