项目里有个地方需要拼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
 关于本站
关于本站