项目里有个地方需要拼insert语句,对于字段值,非数字类型需要加引号,图省事、通用,直接用is_numeric做了判断,上线运行一段时间,还挺顺利
不过今天突然发现,项目出错了,mysql insert执行报错
“Invalid datetime format: 1367 Illegal double ’523e09488200002′ value found during parsing”
于是缩短insert条数、以便日志打印出整个出错sql,果然,’523e09488200002′没有被当成字符串处理,没有加引号
简单测试发现,果然,is_numeric(’523e09488200002′),返回是true 咕~~(╯﹏╰)b
第一反应:php的bug,还是被当成16进制了?
于是多试了几个类似的字符串
———–
523a09488200002: 字符串
523b09488200002: 字符串
523e09488200002: 数字
523f09488200002: 字符串
524e094213214: 数字
523e59: 数字
234e234: 数字
e: 字符串
2e5: 数字
12e: 字符串
—————-
只有“e”被特殊照顾。。。顿悟:科学计数法
进一步查了一下is_numeric的使用限制,不仅科学计数法,前置“0x”、中置“.”、前置“-”,都会被当成数字,返回true
所以这里再用is_numeric的话,就要注意了,要再加一层判断逻辑
———-
转载请注明出处:http://www.jiangkl.com/2021/08/php-is_numeric-bug