Thinkphp5使用sqlite3作为数据库无法存储小数点的解决方案

2023-11-10

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)";
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Thinkphp5使用sqlite3作为数据库无法存储小数点的解决方案 的相关文章

  • oracle lag 函数与 group by

    我有一个查询忽略从前一个值增加的值 例如 采用下表 col1 col2 col3 5 1 A 4 2 A 6 3 A 9 4 B 8 5 B 10 6 B 现在进行以下查询 select col1 from select col1 lag
  • Sql批量复制截断小数

    当我使用批量复制将十进制值从 C DataTable 插入 Sql Server 2005 时 值会被截断而不是四舍五入 DataTable 中的数据类型为 Decimal 数据库中的数据类型为Decimal 19 3 数据表中的值为 1
  • Android 上的 SQLite JDBC 驱动程序

    我正在尝试使用xerial sqlite jdbc在 Android 中管理我的数据库没有成功 我得到了java lang NoClassDefFoundError org sqlite SQLiteConnection异常 我已经导入了这
  • 如何将 .txt 文件中的数据转换为 xml? C#

    我在一个文本文件中有数千行数据 我想通过将其转换为更容易搜索的内容来轻松搜索 我希望 XML 或其他类型的大型数据结构 尽管我不确定它是否是最好的对于我的想法 每行的数据如下所示 第 31 册 托马斯 乔治 32 34 154 每本书都不是
  • 如何将nsmutable数组添加到sqlite数据库表中

    如何将nsmutablearray添加到sqlite数据库表中 有人可以帮我编码吗 您可以使用 for int i 0 i lt mutArray count i NSString string mutArray objectAtIndex
  • Capistrano 部署擦除数据库?

    我已成功使用 Capistrano 将我的应用程序部署到生产环境 但我不明白如何处理我的数据库 我正在使用颠覆和乘客 当我运行 cap 部署时 新部署会重新启动一切 它会清除添加到数据库中的数据 显然 必须有一个解决方案 但我很惊讶没有在网
  • 为 MongoDB 中的对象数组建立索引

    我有一个巨大的电子邮件转储 我正在尝试在 MongoDB 中存储和查询它 有 160 万封电子邮件 每封电子邮件都存储为节点模块 https github com andris9 mailparser它将原始电子邮件解析为漂亮的 Javas
  • Python Tkinter 自动完成组合框与 LIKE 搜索?

    我正在尝试使用预定义的值填充 Tkinter 组合框以供选择 它正在填充 我可以输入并获得建议 然而 为了做到这一点 我必须明确知道前几个字符 如果我知道字符串中间或末尾的一些文本 它是没有用的 因为组合框只执行 LIKE 搜索而不是 LI
  • Jython 的 sqlite3 模块

    我正在使用 Java 脚本 API 从我的 Java 应用程序执行一些外部 Python 脚本 python 脚本使用 sqlite3 模块 应用程序的执行导致错误 ImportError No module named sqlite3 当
  • 需要有关使用 PHP 在 mysql 数据库中插入逗号分隔数据的帮助

    数据库表中已有的演示数据 INSERT INTO csvtbl ID SKU Product Name Model Make Year From Year To VALUES 1 C2AZ 3B584 AR Power Steering P
  • sqlite3权限被拒绝android

    我试图直接在 Nexus 上访问我正在开发的应用程序的数据库 但当我尝试执行 sqlite3 命令时 我收到 权限被拒绝 的消息 我还尝试在 root mod 中启动 adb 但再次 设备上的权限被拒绝 我想我必须使用模拟器来做到这一点 但
  • 如何将 php Web 应用程序转换为桌面应用程序并保留数据库 [关闭]

    Closed 这个问题需要多问focused help closed questions 目前不接受答案 我们有一个用 PHP 开发的 Web 应用程序 但大多数客户并没有一直连接到互联网 那么 有没有办法将应用程序转换为桌面应用程序 以便
  • 如何查看Pocketsphinx词典中是否存在该单词?

    我只是想看看字典文件中是否存在字符串 字典文件位于问题底部 我想检查语音识别器是否可以识别单词 例如 识别器将无法识别字符串ahdfojakdlfafiop 因为字典中没有定义 所以 我可以检查某个单词是否在 pocktsphinx 词典中
  • 如何在数据库中存储年月?

    是否有在数据库中存储年份和月份的标准方法 我需要根据月份和年份制作一些报告 我无法使用日期和函数实时提取月份 因为表很大 所以我需要预处理 我会和 Michael 的建议是什么 https stackoverflow com a 81694
  • 从 Core Data、iOS 获取最后插入的项目

    有没有办法获取核心数据数据库中最后插入的项目 这将返回最后插入的对象 setFetchLimit 1 和 setFetchOffset 所有条目数 1
  • 非规范化如何提高数据库性能?

    我听说过很多关于非规范化的内容 它是为了提高某些应用程序的性能而进行的 但我从来没有尝试过做任何相关的事情 所以 我只是好奇 规范化数据库中的哪些地方会使性能变差 或者换句话说 非规范化原则是什么 如果我需要提高性能 如何使用此技术 非规范
  • 在 SQL 语句的 WHERE 子句中将 string 转换为 int

    我想实现这个目标 SELECT FROM linkledger WHERE toInt reputation gt 100 但是函数 toInt 不存在 有吗 我现在发现了这个 但不起作用 这意味着我有一个更根本的问题 因为这是正确的 SE
  • 如何在asp.net中按下按钮后刷新Gridview

    我正在尝试制作一个简单的图书馆数据库 我在网格视图中列出搜索结果 然后有一个文本框和一个按钮 用户输入 isbn 并单击贷款按钮 然后 如果有足够数量的物品 itemNumber gt 0 则由用户借出 这是用户界面的屏幕截图 我的问题是
  • 如何对 SQL Server Express 进行实时更改

    我一直在使用 VS studio 开发一个 ASP NET Web 应用程序 我正在使用 SQL Server Express 在开发过程中 我一直在我的服务器上测试我的网络应用程序 每次我需要更新数据库时 我都会简单地删除旧数据库 位于我
  • PHP 中正确的存储库模式设计?

    前言 我尝试在具有关系数据库的 MVC 架构中使用存储库模式 我最近开始学习 PHP 中的 TDD 并且我意识到我的数据库与应用程序的其余部分耦合得太紧密 我读过有关存储库并使用国际奥委会容器 http laravel com docs 4

随机推荐

  • 树形结构数据构建算法

    在一些前端开发过程中 我们通常需要将后台查询出来的集合数据进行相应的转换 转成树形结构对象 比如常用的评论区数据就是一种典型的树形结构数据 如下图所示 而后台服务端传来的数据通常是一种普通的集合 元素中有 id 和 pid 以此构成 父子节
  • 程序员计算器

    程序员计算器 这是我们WIN7系统下的程序员的模式 你可以使用不同的进制来表示数 也可以限定数据的字节长度 而且每个数都在下方给出了其二进制的值 非常贴心 所谓程序员计算器 除了这些 还包括各种位运算 下面一一介绍 And Or Not X
  • vue项目如何解决跨域问题

    1 什么是跨域 1 跨域指的是浏览器不能执行其他网站的脚本 它是由浏览器的同源策略造成的 是浏览器施加的安全限制 2 浏览器执行javascript脚本时 会检查这个脚本属于哪个页面 如果不是同源页面 就不会被执行 3 比如你在www 垃圾
  • window10安装MySQL数据库

    准备好软件 MySql的下载参考 1137条消息 mysql下载与安装过程 weixin 40396510的博客 CSDN博客 mysql数据库下载安装 1137条消息 安装MySQL的常见问题 二木成林的博客 CSDN博客 sc不是内部或
  • 手撸一套RBAC权限系统

    文章来源 RBAC权限系统分析 设计与实现 shuwoom com 目前 使用最普遍的权限管理模型正是RBAC Role Based Access Control 模型 这篇文章也主要是介绍基于RBAC的权限管理系统 我会从RBAC是什么
  • sql语句之DML语句

    1 SELECT 语句 SELECT 语句用于从表中选取数据 结果被存储在一个结果表中 称为结果集 SELECT 列名称 FROM 表名称 或 SELECT FROM 表名称 例如 eg SELECT LastName FirstName
  • leetcode面试频率

    参考 http blog csdn net yutianzuijin article details 11477603 ID 问题 频率 数据结构 算法 1 Two Sum 5 array set sort Two Pointers 8 S
  • 不踩坑的Python爬虫:如何快速学会爬取大规模数据

    如果你仔细观察 就不难发现 懂爬虫 学习爬虫的人越来越多 一方面 互联网可以获取的数据越来越多 另一方面 像 Python这样的编程语言提供越来越多的优秀工具 让爬虫变得简单 容易上手 无私分享全套Python爬虫干货 如果你也想学习Pyt
  • 【Android】OpenGL ES---绘制3D图形、应用纹理贴图

    绘制3D图形 glDrawElements int mode int count int type Buffer indices 根据indices指定的索引点来绘制三角形 第一个参数mode指定绘制的图形类型 可设置为GL10 GL TR
  • Matlab玩出新高度,变身表白女孩神器

    Matlab还可以这样玩儿 每逢节日愁哭程序员 不知道该送什么给喜欢的女孩子 在这里教你用Matlab玩儿出属于程序员的浪漫 送给她一整天的惊喜 一 效果图 二 完整模板代码 三 教你如何个性化定制 个性化定制1 个性化定制2 个性化定制3
  • ChatGLM2-6B安装部署(详尽版)

    1 环境部署 合理的上网工具 安装Anaconda3 安装GIT 安装GUDA 11 8 安装NVIDIA 图形化驱动 522 25版本 如果电脑本身是更高版本则不用更新 1 1 检查CUDA 运行cmd或者Anaconda 运行以下命令
  • 通讯录(动态实现与文件优化版)

    实现一个通讯录 通讯录可以用来存储1000个人的信息 每个人的信息包括 姓名 性别 年龄 电话 住址 提供方法 添加联系人信息 删除指定联系人信息 查找指定联系人信息 修改指定联系人信息 显示所有联系人信息 清空所有联系人 以名字排序所有联
  • backward()说明

    1 out backwark 中out是一个标量 此时可以直接使用out backwark import torch from torch autograd import Variable 生成一个内容为 2 3 的张量 Varibale
  • 半角和全角的区别

    很多时候我们阅读代码指导或者其他输入法总是会提到全角和半角 那么他们的区别是啥呢 区别 半角全角主要是针对标点符号来说的 全角标点占两个字节 半角占一个字节 而不管是半角还是全角 汉字都还是要占两个字节 英文半角占一个字节 也就是1byte
  • 六、STL容器:STL仿函数总结

    6 STL仿函数 6 1 概念 模仿函数的类 使用方式如同函数 本质是类中重载括弧运算符operator 6 2 场景 不同函数复用相同处理代码 6 3 使用 6 3 1 C语言的处理方式 使用函数指针和回调函数来实现代码复用 例如qsor
  • 记录的index表介绍

    index表定义 TYPE type name IS TABLE OF element type NOT NULL INDEX BY BINARY INTERGET 例如 1 TYPE emp type array IS TABLE OF
  • 365天挑战LeetCode1000题——Day 264 周赛336

    第一题 遍历 class Solution public int vowelStrings vector
  • python练习实例——金币问题

    目录 题目 解法 输出结果 题目 noip2015 复赛第一题 国王将金币作为工资 发放给忠诚的骑士 第一天 骑士收到一枚金币 之后两天 第二天和第三天 每天收到两枚金币 之后三天 第四 五 六天 每天收到三枚金币 之后四天 第七 八 九
  • sojson jsjiami.com.v6 爬虫js逆向

    sojson jsjiami com v6 爬虫js逆向 地址 aHR0cDovL3d3dy5wYmMuZ292LmNuL3JteWgvMTA1MjA4Lzg1MzIvaW5kZXg1Lmh0bWw 抓取内容 第一次请求 发现返回的不是正确
  • Thinkphp5使用sqlite3作为数据库无法存储小数点的解决方案

    Thinkphp5使用sqlite3作为数据库无法存储小数点的解决方案 在tp的官网搜了一下资料 主要是因为TP5自动绑定内型的时候自动将一些浮点数等类型的数字强制将PDO类型设置为了INT类型 而使用SQLITE数据库时 添加的语句遇到小