Mysql SQL的Replace()如何匹配?

Mysql SQL的Replace()如何匹配?,mysql,Mysql,MySQL匹配的必须在replace语句中回退到52个不同的值。我不明白这怎么可能。那么,MySQL是如何匹配对象的呢 我做了一次从英国到英国的替换,并打印了不同的国家。它起到了作用,但我注意到一个错误,那就是作为一个国家,必须支持财政部。我用NULL替换了它,结果MySQL用NULL替换了所有国家/地区的值 | 19 | 15:22:27 | UPDATE Trade SET country = REPLACE(country, "UK", "United Kingdom") | 360 ro

MySQL匹配的
必须在replace语句中回退到52个不同的值。我不明白这怎么可能。那么,MySQL是如何匹配对象的呢

我做了一次从英国到英国的替换,并打印了不同的国家。它起到了作用,但我注意到一个错误,那就是作为一个国家,必须支持财政部。我用
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 |
编辑: 好的,在玩过之后,我可以确认,无论何时尝试替换(Field,item,NULL)
,它都会完全忽略搜索和匹配,而会在字段中的每个值上删除
NULL

因此,问题仍然是,有人知道为什么会发生这种情况吗?

因为
REPLACE()
将输入字符串与值匹配。它检查输入字符串是否是字段值的子字符串,如果是,则用您的值替换它。因此,当您尝试将
UK
替换为
UK
时,它会在您的数据中搜索所有出现的
UK
,并将其全部替换

使用
WHERE
指定故障记录并进行更换,而不是进行更换

UPDATE Trade SET country=NULL,其中country=“Must backout Treasury”

updatetradesetcountry=NULL,其中像“%Must backout Treasury%”这样的国家在MySQL中,大多数涉及
NULL
值的字符串操作的计算结果都是
NULL
。这种行为在思考
NULL
表示“我不知道这有什么价值”的想法时是有意义的

考虑:

 SELECT CONCAT('abc',NULL)
返回
NULL
。如果我在“abc”后面加上一个“unknown”值,结果将是“unknown”。同样地

 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 ...

因为你没有WHERE子句。记住,REPLACE只是一个字符串操作函数,而不是一个搜索标准。我的建议是,您实际上有9773行,其中有
“必须回退”
国家/地区
列中要在更新前写一个检查,请始终运行
从y中选择x,其中col\u in_question='坏数据'
检查应更新多少行,并检查您的条件是否正确您的查询将修改
国家/地区
列中包含
必须退出国库“
的任何行。它将搜索表23027中的所有行,但只更新找到“必须收回资金”的行。
9773我想它完全按照您的要求做了。它只搜索了国家字段否?但是的,它正确地找到了英国,并用英国取代了英国。我感到困惑的是,它似乎在每个国家/地区字段中都发现了“必须退出国库”,这是不可能的,因为“联合王国”现在至少是52个不同值中的1个。不同值将显示输出中的一行,即使有100000行包含单个值!!!!是,它只搜索了
国家
字段。正如@riggsfully所提到的,
DISTINCT
只显示一个值,这让您错误地认为,当存在多个时,只有一个必须回退的资金记录。因此,它取代了
国家/地区
字段中出现的每一个值,我知道这是不同的,也许你过度关注的是,还有51个不同的值,而MySQL匹配了所有这些值的“必须退出国库”。如果有任何一个条目将其作为子字符串,这是可能的,但我们都知道“联合王国”是1,我知道还有50个国家没有将其作为子字符串……这不是一个国家,所以当您运行
UPDATE Trade SET country=REPLACE(country,“Must backout Treasury”,NULL)
然后运行
DISTINCT
调用时,上面写着1吗<代码>|9773行受影响的行匹配:23027更改:9773警告:0 |这只是说它更改了很多行。您的表有9773条记录吗?好的,但是后端不应该被写入,所以如果“d”不在其中,那么就中断吗?比如,当它找不到“d”的位置开始时,为什么要尝试输入NULL?这是计算中的一个快捷方式,很可能是在优化时而不是运行时完成的。MySQL计算表达式
REPLACE(x,y,NULL)
,得到的快捷方式值为NULL。这就好像我们刚刚编写了
NULL
。同样的事情也发生在CONCAT(x,NULL)上。唯一不会出现这种快捷方式的情况是,我们使用了一个不知道所有行都为NULL的表达式<代码>CONCAT(t.x,t,y),,,在我们查看每一行之前,我们不知道x和y的值。啊,好吧!谢谢你们两位。我在争论我的理智。使用
NULL
值会让任何人质疑它们的理智!