Nodejs开发者注意:mysql处理BIGINT里面的一个坑

Nodejs开发者注意:mysql处理BIGINT里面的一个坑

发现bigint数据,读取的时候,被约份了,后来查一下数据模块,发现这样就可以完美解决,分享一下

supportBigNumbers: When dealing with big numbers (BIGINT and DECIMAL columns) in the database, you should enable this option (Default: false).

var connection = mysql.createConnection({ host : ‘example.org’, user : ‘bob’, password : ‘secret’, supportBigNumbers: true });

PS:我是被迫用bigINT的,能不用就不用,bigint其实是很不合理的,无奈接入的API的数据类型是bigint,就好默默流泪了。


3 回复

Node.js 开发者注意:mysql 处理 BIGINT 里面的坑

在使用 Node.js 进行 MySQL 数据库操作时,经常会遇到一些令人头疼的问题。其中一个常见的问题是当从数据库中读取 BIGINT 类型的数据时,数据可能会被四舍五入或截断,导致精度丢失。本文将介绍如何通过配置 mysql 模块来正确处理 BIGINT 类型的数据。

问题描述

当你从 MySQL 数据库中读取 BIGINT 类型的数据时,如果这些数据超出了 JavaScript 的 Number.MAX_SAFE_INTEGER 范围(即大于 2^53 - 1),那么这些数据会被自动转换为浮点数,从而导致精度丢失。例如,如果你有一个超过 15 位数字的 BIGINT 值,它可能会被四舍五入或截断。

解决方案

为了解决这个问题,你可以启用 mysql 模块中的 supportBigNumbers 选项。该选项默认为 false,但当你将其设置为 true 时,mysql 模块会将 BIGINTDECIMAL 类型的数据以字符串形式返回,从而保留其精度。

示例代码

以下是一个简单的示例,展示了如何配置 mysql 模块以支持 BIGINT 类型数据的正确处理:

const mysql = require('mysql');

// 创建一个数据库连接
const connection = mysql.createConnection({
    host: 'example.org',
    user: 'bob',
    password: 'secret',
    database: 'testdb',
    supportBigNumbers: true // 启用支持大数
});

// 连接到数据库
connection.connect((err) => {
    if (err) {
        console.error('Error connecting to database:', err);
        return;
    }
    console.log('Connected to database');
    
    // 查询包含 BIGINT 数据的表
    connection.query('SELECT * FROM my_table', (error, results, fields) => {
        if (error) throw error;
        
        // 打印查询结果
        results.forEach(result => {
            console.log(`BIGINT value: ${result.bigint_column}`);
        });
    });
});

// 断开连接
connection.end();

注意事项

  • 避免使用 BIGINT:虽然有时你可能需要处理 BIGINT 类型的数据,但在可能的情况下,最好避免使用它们,因为它们可能导致精度问题。
  • API 接入限制:如果 API 返回的数据类型是 BIGINT,你可能无法避免使用它们。在这种情况下,确保你的数据库查询配置正确,以防止数据精度丢失。

希望这篇文章对你有所帮助!


嗯,如果后端是long(bigint)的数字类型,传到前端js时就会被js给约掉,因为js里的number有最大值限制。参考这篇:http://cnodejs.org/topic/4fb3722c1975fe1e132b5a9a

在Node.js中使用MySQL时,处理BIGINT类型的数据可能会遇到一些问题。特别是当你从数据库中读取BIGINT值时,它们可能会被转换为浮点数并因此丢失精度。为了解决这个问题,你可以启用mysql模块中的supportBigNumbers选项。

示例代码

const mysql = require('mysql');

// 创建一个MySQL连接
const connection = mysql.createConnection({
    host: 'example.org',
    user: 'bob',
    password: 'secret',
    supportBigNumbers: true // 启用此选项以正确处理大数字
});

// 连接到数据库
connection.connect((err) => {
    if (err) throw err;
    console.log('Connected to MySQL database!');
    
    // 查询包含BIGINT数据的表
    connection.query('SELECT * FROM your_table', (error, results, fields) => {
        if (error) throw error;
        
        // 打印查询结果
        results.forEach(row => {
            console.log(`BIGINT value: ${row.your_bigint_column}`);
        });
    });

    // 断开连接
    connection.end();
});

解释

  • supportBigNumbers: true:通过启用该选项,mysql模块将能够正确地处理BIGINT类型的数据,并且不会将其转换为浮点数。

  • 使用createConnection创建一个连接对象,并传入所需的配置信息。

  • 在连接成功后,执行一个简单的查询以获取包含BIGINT列的数据。

  • 最后打印出每一行中的BIGINT列的值。

注意事项

尽管启用supportBigNumbers可以解决精度丢失的问题,但如果你可以避免使用BIGINT,最好还是选择其他更合适的数据类型(例如VARCHAR),因为BIGINT通常用于非常大的整数值,这可能导致性能问题和存储空间浪费。

回到顶部