MySQL在替换语句中将Must backout Treasury匹配为52个不同的值。我不明白这怎么可能。那么,MySQL如何匹配对象呢?
我做了一次从UK到UK的替换,并打印了不同的国家。它起了作用,但我注意到Must backout Treasury作为一个国家的错误。我去用NULL替换它,但是MySQL用NULL替换了所有的国家值。
| 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。
所以,问题仍然存在,有人知道为什么会发生这种事吗?
发布于 2019-03-13 21:25:28
在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 ...发布于 2019-03-13 20:18:22
因为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%"
https://stackoverflow.com/questions/55150424
复制相似问题