MySQL中VARCHAR类型Price列批量格式化保留两位小数的UPDATE语句执行无效求助
MySQL中VARCHAR类型Price列批量格式化保留两位小数的UPDATE语句执行无效求助
兄弟,我一眼就瞅出问题出在哪了——你的Price列是VARCHAR类型,这直接导致你之前的UPDATE看似逻辑正确,但实际上MySQL在隐式转换时偷偷“偷懒”了!
问题根源
当你用ROUND(Price, 2)得到的是数值类型的结果(比如66.00),把它赋值给VARCHAR列时,MySQL会自动把这个数值转成字符串,但它会默认去掉末尾无意义的.00。也就是说原列的"66"赋值后还是"66",数据库判定值没有变化,自然不会更新任何行,这就是为啥你看到0 rows affected。
解决方案:显式格式化字符串
我们需要把四舍五入后的数值强制格式化为带两位小数的字符串,而不是依赖MySQL的隐式转换。这里用FORMAT()函数配合REPLACE()(避免千分位逗号干扰)就能完美解决,同时修正你原正则的小漏洞:
1. 先运行SELECT验证结果(安全第一!)
SELECT ID, Price, REPLACE(FORMAT(ROUND(Price, 2), 2), ',', '') AS Fixed_Price FROM your_table_name WHERE Price REGEXP '^[0-9]+(\\.[0-9]*)?$'
- 修正后的正则
^[0-9]+(\\.[0-9]*)?$:确保只匹配纯数值字符串(转义小数点\\.,用^和$锚定首尾,避免匹配到含数字的非数值内容) FORMAT(ROUND(Price,2),2):先四舍五入,再格式化为两位小数的字符串(比如66→"66.00",42.2→"42.20")REPLACE(..., ',', ''):去掉FORMAT()自动添加的千分位逗号(比如1234→"1,234.00"会被修正为"1234.00")
2. 确认结果正确后执行UPDATE
UPDATE your_table_name SET Price = REPLACE(FORMAT(ROUND(Price, 2), 2), ',', '') WHERE Price REGEXP '^[0-9]+(\\.[0-9]*)?$'
这条语句会把所有符合条件的Price值更新为标准两位小数的字符串,同时不会改动空值或£CALL for price这类非数值内容,完全符合你的需求。
小提醒
执行UPDATE前建议先备份数据,或者用事务包裹(InnoDB引擎支持),万一出问题可以快速回滚哦~
内容来源于stack exchange
相关产品推荐
相关产品推荐

