Sqlite 返回值与数据库不同

Posted

技术标签:

【中文标题】Sqlite 返回值与数据库不同【英文标题】:Sqlite returning value different from database 【发布时间】:2020-04-23 17:36:32 【问题描述】:

我目前正在使用 discord.js 开发一个不和谐机器人。几天前我最近开始自学 SQLite(所以我可能只是个白痴......可能)。无论如何,在下面的代码中,我试图从 SQlite DB 中选择值并将它们推送到数组中以作为消息发送。问题是,ID 似乎在四舍五入,我尝试将其转换为字符串(这是在它们已经是整数值之后,我尝试重新输入这些值但没有奏效),但是,它没有帮助。在数据库中,这些值是正确的,但是当返回这些值(以不和谐消息的形式)时,这些值是错误的。该问题似乎仅存在于 SQLite 查询中,因为返回的值没有通过脚本和控制台记录行进行修改,返回的值已经四舍五入。另外:代码非常混乱,请告诉我哪里出错了。 值四舍五入为: 从 -> 到

231324359870906368 -> 231324359870906370 342592681790144513 -> 342592681790144500 310682989380108290 -> 310682989380108300 345801479329677313 -> 345801479329677300 549366490919469096 -> 549366490919469100 199416992615235600 -> 199416992615235586 158100000000000123 -> 158100000000000130

我的测试值 (158100000000000123) 显示一定存在舍入误差,因为该值是正确的,直到它与其他值的长度相同。 我还尝试创建另一列,它是一个字符串,但是当值的长度相同时,仍然会发生舍入。非常感谢任何帮助!

      var partners = [];
      var price = [];
      var partnerembed;
      var i;
      function getPartners(id)
        var query = "SELECT * FROM partners WHERE userid = " + id;
          db.all(query, function (err, rows) 
            if(err)
                console.log(err);
            
            else
            
              console.log(rows[0].partner)
              for (i = 0; i <= rows.length-1; i++)
              
                partners.push(rows[i].partner)
                price.push(rows[i].price)
              
            
          );
        
      getPartners(message.author.id);
      function partnerMessage()
      
        var partnerembed = new RichEmbed()
              .setTitle('You are married to:')
              .setAuthor(message.author.username, id.displayAvatarURL)
              .setColor(0x8AC784);
        for (i=0; i<= partners.length-1; i++)
        
          partnerembed.addField(partners[i], price[i])
           
        message.channel.send(partnerembed)
      
      setTimeout(partnerMessage, 1000)

数据库值:

userid partnerid price 332734758515769354 231324359870906368 420000 332734758515769354 342592681790144513 1 332734758515769354 310682989380108290 4 332734758515769354 345801479329677313 1000 332734758515769354 276968137293824021 2000 332734758515769354 549366490919469096 5000 332734758515769354 199416992615235586 5 332734758515769354 158100000000000123 5

另外,不要质疑为什么我的机器人认为婚姻本质上只是奴隶制 - 它只是有点慢......

【问题讨论】:

把列的类型改成TEXT就行了 【参考方案1】:

sqlite 返回了正确的值,不幸的是它比 js 可以处理更多的整数。

js 支持53 bit integers。控制台中的一个简单js

p = 158100000000000123; 
console.log(p);   

产生相同的结果。

尝试使用 CAST(在this page 上找到的文档)从数据库中选择列作为字符串,然后在 js 中将所有列视为字符串。

【讨论】:

以上是关于Sqlite 返回值与数据库不同的主要内容,如果未能解决你的问题,请参考以下文章

SQLite Instr 提供的值与预期不同

存储过程中的临时表返回的值与常规查询不同

为啥 MySQL BIT_OR() 返回的值与 PHP 位运算不同

Python pytz 时区转换返回的值与不同日期的时区偏移量不同

为啥 Oracle ADD_MONTHS() 返回的 sysdate 值与我硬编码今天的日期不同?

从 SQLite 中的所有行中减去平均值