解决MySQL Workbench 8中更新查询无数据变更的问题
问题拆解与解决办法
为啥账号末尾会冒出来\r字符?
这事儿跟系统换行格式有关——Windows系统的换行是\r\n(回车+换行),而你写LOAD DATA的时候指定的行终止符是单独的\n。你从XLSX转出来的CSV用的是Windows格式的换行,所以导入时MySQL只去掉了\n,把每行末尾的\r给留在账号里了。平时查MySQL的时候看不到这个隐藏字符,但复制到记事本就显形了,这就是导致账号匹配不上的元凶。
两步解决:清掉\r+确保更新生效
有两种思路都能搞定,选哪个看你当前的操作阶段:
思路1:导入时直接把\r干掉(推荐)
修改你的LOAD DATA命令,让它适配Windows的换行格式,再加个额外的清理步骤双重保险:
LOAD DATA LOCAL INFILE "C:/testaccounts.csv" INTO TABLE tempfile FIELDS TERMINATED BY ' ' ENCLOSED BY '"' LINES TERMINATED BY '\r\n' -- 对应Windows的换行符 IGNORE 1 ROWS (accounts) SET accounts = TRIM(TRAILING '\r' FROM accounts); -- 彻底清掉末尾的\r
思路2:已经导入了?那就事后修正
如果已经把数据导入临时表了,直接执行下面的更新语句,在加前缀0的同时把\r去掉:
UPDATE tempfile SET accounts = concat('0', TRIM(TRAILING '\r' FROM accounts)) WHERE accounts IS NOT NULL;
验证+最终更新
先确认临时表的账号干净了:
SELECT accounts, HEX(accounts) FROM tempfile;
看HEX(accounts)的结果,如果没有0D(这是\r的十六进制编码),就说明没问题了。
然后再跑更新users表的语句:
UPDATE users SET status = 'A' WHERE account IN (SELECT accounts FROM tempfile);
这次就能精准匹配,成功更新状态啦。
内容的提问来源于stack exchange,提问作者Anjit Singha




