Thinkphp5使用sqlite3作为数据库没办法存储小数点的解决方案
Thinkphp5使用sqlite3作为数据库无法存储小数点的解决方案
在tp的官网搜了一下资料,主要是因为TP5自动绑定内型的时候自动将一些浮点数等类型的数字强制将PDO类型设置为了INT类型,而使用SQLITE数据库时,添加的语句遇到小数的时候就没有加上双引号,所以在写入数据的时候就自动把小数点后面的截断了。
thinkphp\library\think\db\Query.php 自动绑定类型的相关代码
protected function getFieldBindType($type)
{
if (0 === strpos($type, 'set') || 0 === strpos($type, 'enum')) {
$bind = PDO::PARAM_STR;
} elseif (preg_match('/(int|double|float|decimal|real|numeric|serial|bit)/is', $type)) {
$bind = PDO::PARAM_INT;
} elseif (preg_match('/bool/is', $type)) {
$bind = PDO::PARAM_BOOL;
} else {
$bind = PDO::PARAM_STR;
}
return $bind;
}
生成的建表语句如下,可以看到小数并没有引号,所以插入失败。
INSERT INTO dc_pay (pay_name , pay_sign , pay_info_id , pay_user_id , pay_price , pay_quantity , pay_total_fee , pay_status , pay_module , pay_controll , pay_action , pay_scene , pay_platform , pay_content , pay_create_time , pay_update_time) VALUES ('rechargeScore' , '2022022016012877780' , 1 , 1 , 23.33 , 1 , 0.12 , 1 , 'user' , 'recharge' , 'score' , 'pc' , 'alipay' , '---' , 1645344088 , 1645344088);
解决方案如下,在不修改thinkphp5原代码的核心内核情况下,我们只需要修改sqlite3连接引擎里面获取数据表字段相关 打开 thinkphp\library\think\db\connector\Sqlite.php 将 ‘type’ => $val[‘type’] 换成 ‘type’ => t h i s − > f i e l d s T y p e ( this->fieldsType( this−>fieldsType(val[‘type’])
/**
* 特殊类型转换为SQLITE常用字段(TP自动绑定时获取的类型)
* @param string $type
* @return string
*/
private function fieldsType($type=''){
if(preg_match('/(int|double|float|decimal|real|numeric|serial|bit)/is', $type)){
return 'TEXT';
}
return $type;
}
最终我们使用getLastSql函数查看最终执行的语句时就正常了。
"INSERT INTO dc_pay (pay_name , pay_sign , pay_info_id , pay_user_id , pay_price , pay_quantity , pay_total_fee , pay_status , pay_module , pay_controll , pay_action , pay_scene , pay_platform , pay_content , pay_create_time , pay_update_time) VALUES ('rechargeScore' , '2022022016075637951' , 1 , 1 , '23.33' , 1 , '0.12' , 1 , 'user' , 'recharge' , 'score' , 'pc' , 'alipay' , '---' , 1645344476 , 1645344476)";
这篇好文章是转载于:学新通技术网
- 版权申明: 本站部分内容来自互联网,仅供学习及演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,请提供相关证据及您的身份证明,我们将在收到邮件后48小时内删除。
- 本站站名: 学新通技术网
- 本文地址: /boutique/detail/tanhgakbae
系列文章
更多
同类精品
更多
-
photoshop保存的图片太大微信发不了怎么办
PHP中文网 06-15 -
《学习通》视频自动暂停处理方法
HelloWorld317 07-05 -
Android 11 保存文件到外部存储,并分享文件
Luke 10-12 -
word里面弄一个表格后上面的标题会跑到下面怎么办
PHP中文网 06-20 -
photoshop扩展功能面板显示灰色怎么办
PHP中文网 06-14 -
微信公众号没有声音提示怎么办
PHP中文网 03-31 -
excel下划线不显示怎么办
PHP中文网 06-23 -
excel打印预览压线压字怎么办
PHP中文网 06-22 -
怎样阻止微信小程序自动打开
PHP中文网 06-13 -
TikTok加速器哪个好免费的TK加速器推荐
TK小达人 10-01