请问NodeJS怎么存一个JSON对象到MySQL 5.7数据库里?
发布于 6 年前 作者 hz0324 7510 次浏览 来自 问答

我们有如下的数据类型要保存: { name:"小王" updateTime:123123132 //注意,这里是数字 }

在MySQL 5.7之前,都是先用JSON.stringfy转成字符串,然后以varchar的形式保存,然后取出时,再用JSON.parse的方法把字符串转成json对象。可以经过这么一次操作,拿到的数据就会变成下面的样子: { name:"小王" updateTime:“123123132” //注意,这里变成了字符串 }

也就是说,数字格式的value就也变成了string。这对我们的开发影响很大。我们希望存的JSON在取出时,数字还是数字,不要变成String。 刚刚看到说5.7已经支持JSON格式了,但是我们自己开了一个5.7试了好多次,都没能正确保存进去。 请问,该怎么做啊?

5 回复

换pgsql,使用jsonb字段类型,一了百了。 细节是魔鬼,mysql真用起来无数的坑 。mysql所谓的“支持”和真正能用、敢用、好用是两码事。除非你有能力修改源码。

我试了一下,数据并没有变成字符串,依然是number类型

首先呢,JSON.stringfy并不会转化你的类型。

第二,mysql存储不关乎语言,构造sql语句而已。。。先用数据库工具试试吧

我试了下,使用JSON类型不会转成字符串的。

先建表

create table t1 (jdoc JSON);

插入数据

const insertTest = () => {
  const obj = {
    name: 'blackmatch',
    age: 29,
  };

  const sql = `INSERT INTO t1 VALUES('${JSON.stringify(obj)}');`;
  connection.query(sql, (error, results, fields) => {
    if (error) {
      throw error;
    }

    console.log(results);
  });
};

查询数据,检查类型

const queryTest = () => {
  const sql = 'SELECT * from t1;';
  connection.query(sql, (error, results, fields) => {
    if (error) {
      throw error;
    }

    console.log(results);

    for (const row of results) {
      const obj = JSON.parse(row.jdoc);
      console.log(typeof (obj.age));
    }
  });
};

结果:

image.png

完整代码

const mysql = require('mysql');

var connection = mysql.createConnection({
  host: 'localhost',
  user: 'root',
  password: '123',
  database: 'nodejs'
});

connection.connect();

const insertTest = () => {
  const obj = {
    name: 'blackmatch',
    age: 29,
  };

  const sql = `INSERT INTO t1 VALUES('${JSON.stringify(obj)}');`;
  connection.query(sql, (error, results, fields) => {
    if (error) {
      throw error;
    }

    console.log(results);
  });
};

const queryTest = () => {
  const sql = 'SELECT * from t1;';
  connection.query(sql, (error, results, fields) => {
    if (error) {
      throw error;
    }

    console.log(results);

    for (const row of results) {
      const obj = JSON.parse(row.jdoc);
      console.log(typeof (obj.age));
    }
  });
};

// insertTest();
queryTest();

官方文档有这样一句话:

In MySQL, JSON values are written as strings. MySQL parses any string used in a context that requires a JSON value, and produces an error if it is not valid as JSON.

JSON类型也是以字符串的形式写入的,会检验字符串是否符合json格式。

image.png

借楼问,那么JSON类型和varchar类型的区别就是多了个校验么?我们公司的项目目前都是用varchar来存json对象的。求大佬们指教。

回到顶部