5.0.0 - 严重 - 已关闭
使用 sqlite , 栏位型态是 real , update 或 insert 存入有小数点的数值储存的结果,只剩下整数。
以下是小清新测试的结果
1.
使用 navicat insert 一笔数据数
INSERT INTO rei_task (user_id , task_name , start_time , reward_type , reward_amount , config_id , require_type , require_amount) VALUES (1 , '素素看' , 1476028800 , 'score' , 10.6 , 1 , 'distrib' , 300)
这串 SQL 是之前测试 tp5 所生成的, 复制下来
结果正常, 如下图

2.在tp5里面 insert一笔数据

reward_amount应该是 10.6 , 结果只有10, 如下图的第二笔数据,第一笔是 navicat insert 的

运行的页面,SQL部份提示如下图

当使用tp5生成的 SQL 运行时,都正常,让有的小数点都有,但是在 tp5 下运行,小数点就被舍去了。
====================================分隔线
因为中午发生一件怪事,聚合查询在没有任何更新的前提,
聚合查询竟然又生效了,所以重新再测试一次这个问题,然後补充如下
10月13日补充如下:
1. 同时用tp5 insert 以及 execute 原生 insert, 代码如下

public function testReal(){
$task_config = \think\Db::name('task_config')->where('config_id','=',1)->find();
$task = [
'user_id'=>1,
'task_name' => date('m-d',time()).$task_config['task_name'],
'start_time' => time(),
'reward_type' => 'score',
'reward_amount'=> 10.6,
'config_id'=>$task_config['config_id'],
'require_type'=>$task_config['require_type'],
'require_amount' => $task_config['require_amount']
];
$task['task_id'] = \think\Db::name('task')->insertGetId($task);
\think\Db::execute( "INSERT INTO rei_task (user_id , task_name , start_time , reward_type , reward_amount , config_id , require_type , require_amount) VALUES (1 , '10-13推荐奖金-直推' , 1476348482 , 'score' , 10.6 , 1 , 'contend' , 30)");
}2. 再确认一次, 关键的 SQL 两个是一致的
3. 运行结果, 两笔 insert的数据(reward_amount)不一致

======================================分隔线
10月13日非官方解决方案
无法写入小数点的原因,应该是 PDOStatement->bindValue 不知为什麽失效
(失效是看PDOStatement->queryString的结果猜测的,不是真正原因 )
所以 bindValue 之後 PDOStatement->queryString 里面的占位符没有被取代掉
决定绕过 bindValue
打开 /thinkphp/library/think/db/connection.php 找到 public function execute($sql, $bind = []) 这个函数
1. 约 394行 $this->PDOStatement = $this->li
注释後加上 $this->PDOStatement = $this->li
2. 往下2行(396行) $this->bindValue($bind) 注释掉
原理, 用$this->queryStr 取代 $sql
因为 $this->queryStr 在这个函数里面约 382行 $this->queryStr = $this->getRealSql($sql, $bind); 已经把SQL组合完成。
