MySQL将替换语句中的Must backout Treasury
匹配为52个不同的值。我不明白这怎么可能。那么,MySQL如何匹配对象呢?
我做了一个从英国到英国的替换,并打印了不同的国家。它奏效了,但我注意到一个国家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
。
所以,问题仍然存在,有谁知道为什么会发生这种情况?
因为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%"
在 MySQL 中,大多数涉及NULL
值的字符串操作最终计算结果为NULL
。这种行为在思考NULL
代表"我不知道这有什么价值"的想法方面是有意义的。
考虑:
SELECT CONCAT('abc',NULL)
返回NULL
。如果我将"未知"值附加到"abc",结果将是"未知"。同样地
SELECT REPLACE('abc','d',NULL)
将"未知"值放入字符串中将产生"未知"值。所以这个表达式返回NULL
.'d'
是否出现在'abc'
中并不重要。
通常,我们在将表达式合并到UPDATE
语句之前先在SELECT
语句中测试表达式。这让我们确认正在匹配的行,以及表达式的结果,例如
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 ...