当源代码是regexp的结果时,MySQLCAST会丢失小数位,但当它是硬编码的时,它可以在相同的字符串上正常工作

kuhbmx9i  于 2023-01-12  发布在  Mysql
关注(0)|答案(1)|浏览(82)

我得到了完全令人困惑的结果......我把它归结为:

select
    regexp_substr('56.948959;24.121503|56.950469;24.119765', '^[0-9\.]+') raw_txt,
    cast('56.948959' as decimal(10,8)) just_cast,
    case when regexp_substr('56.948959;24.121503|56.950469;24.119765', '^[0-9\.]+') = '56.948959' then 'yisss' else 'nope' end text_comparison,
    cast(regexp_substr('56.948959;24.121503|56.950469;24.119765', '^[0-9\.]+') as decimal(10,8)) full_decimal,
    cast(regexp_substr('56.948959;24.121503|56.950469;24.119765', '^[0-9\.]+') as double) full_double

我得到的结果是:

raw_txt: 56.948959
just_cast: 56.94895900
text_comparison: yisss
full_decimal: 56.00000000
full_double: 56.948959

full_decimal的小数点在哪里?为什么在简单字符串(just_cast)上运行时,强制转换可以正常工作,而当完全相同的字符串(参见text_comparison)来自正则表达式匹配时就不行了?但是如果我们强制转换为double,它仍然可以工作?这是怎么回事?
MySQL版本:8.0.21

ecbunoof

ecbunoof1#

这被报告为bug
如果先转换为char,然后重新转换为decimal,则转换有效。
例如:

select cast(cast(regexp_substr('56.948959;24.121503|56.950469;24.119765', '^[0-9\.]+') as char(100)) as decimal(10,8)) full_decimal

Full answer here

相关问题