我们有如下的数据类型要保存: { name:"小王" updateTime:123123132 //注意,这里是数字 }
在MySQL 5.7之前,都是先用JSON.stringfy转成字符串,然后以varchar的形式保存,然后取出时,再用JSON.parse的方法把字符串转成json对象。可以经过这么一次操作,拿到的数据就会变成下面的样子: { name:"小王" updateTime:“123123132” //注意,这里变成了字符串 }
也就是说,数字格式的value就也变成了string。这对我们的开发影响很大。我们希望存的JSON在取出时,数字还是数字,不要变成String。 刚刚看到说5.7已经支持JSON格式了,但是我们自己开了一个5.7试了好多次,都没能正确保存进去。 请问,该怎么做啊?
换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));
}
});
};
结果:
完整代码
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格式。
借楼问,那么JSON
类型和varchar
类型的区别就是多了个校验么?我们公司的项目目前都是用varchar
来存json对象的。求大佬们指教。