sqlite无法存储小数点,附临时解决方案,谢谢官方关注

浏览:3726 发布日期:2016/10/12
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->linkID->prepare($sql);
注释後加上 $this->PDOStatement = $this->linkID->prepare($this->queryStr);
2. 往下2行(396行) $this->bindValue($bind) 注释掉

原理, 用$this->queryStr 取代 $sql
因为 $this->queryStr 在这个函数里面约 382行 $this->queryStr = $this->getRealSql($sql, $bind); 已经把SQL组合完成。

评论(
后面还有条评论,点击查看>>