MySQL含$字符串转数字,替换货币符号再CAST
做数据开发这些年,见过太多把金额存成'€1,299.50'的。字符串夹着货币符号和千分位逗号,直接CAST就报错或全变0。说几个我常用的处理思路。
最典型是电商多站点,金额字段变成'$29.99'、'€15.00'、'¥88'。直接CAST(...AS DECIMAL)时MySQL会截掉非数字部分,'$29.99'变29.99还行,但'€1,299'直接变0,数据就废了。
最稳的办法是REPLACE链式替换。REPLACE(REPLACE(REPLACE(col,'$',''),',',''),'€',''),把货币符号和千分位逗号清干净mySQL含货币符号字符串转数字,再CAST(cleaned AS DECIMAL(10,2))。符号不确定就多套几层,或用REGEXP_REPLACE一次去掉[^0-9.]。

历史数据几百万行脏字符串,写个UPDATE批量刷是唯一出路:UPDATE orders SET amount=CAST(REPLACE(REPLACE(amount,'¥',''),',','') AS DECIMAL(10,2)) WHERE amount LIKE '%[¥$€]%';新数据则应用层转好再入库,MySQL只存纯数字。
REGEXP_REPLACE里[0-9.]的.是通配符,得写成[0-9\\. ]。另外NULL和空串要提前判,不然CAST(NULL)返回NULL,SUM时整列就没了。
你们项目是应用层转好再入库MySQL含$字符串转数字,替换货币符号再CAST,还是让MySQL直接扛脏数据?
