如何将速度数组[x,y,z]转换为字符串以存储在数据库中?

3

我想要存储一个速度向量,声明如下:

 me.vel = [0, 0, 0];

将数据存储到MySQL数据库中。我认为在存储之前需要将其转换为字符串,但这是因为我不知道任何适合存储的类型,例如:VARCHAR、INT、STRING等(如果可以存储,请告诉我应该使用哪种类型,这样就可以更简单地解决问题,而且不必将其转换为字符串然后再转换回向量)

我尝试过:

 var velocityString = me.vel.join();
 var velocityString = String(me.vel);

但是这些似乎都不起作用。

我如何将这个数组转换为字符串?

谢谢, Digimas


string.concat(str1, str2, ..., strN) 可以解决问题,但你可能会在拆包时遇到麻烦。 - Joseph Weissman
为什么大家都同意将数字存储为字符串? - Michael Mior
因为这是被问到的问题,而我不是MySQL数据类型方面的专家。 - lawnsea
6个回答

2
为什么不将数据存储为三个单独的列?使用 vel_x, vel_y, vel_z(也许是 DOUBLE 类型)会更加清晰,而且可以避免频繁地进行字符串转换。请注意保留 HTML 标签。

2

或者您可以将该对象进行json编码。


1

如果(我认为不是这种情况)速度元素值是固定的,您可以使用MySQL SETENUM数据类型之一来存储数组。

否则,我会选择JSON并将JSON编码的字符串存储在VARCHAR字段中(除非您存储的是光速度)1

/* Store:    */ JSON.encode([1,2,3]);            //=> "[1,2,3]"
/* Retrieve: */ JSON.parse(velocityFromSQL); //=> [1,2,3]

1 VARCHAR 可以包含最多255个字符


1
你尝试的两种解决方案都应该可以工作。我得到了两个解决方案都是"0,0,0"的结果。但正如Christopher之前建议的那样,JSON编码会起作用,并且在我看来是最好的解决方案。连接或字符串化只会创建一个逗号分隔的列表,对于这样一个单一的示例来说可能还可以,但如果你做任何更复杂的事情,你可能会失去数据的含义(比如说,如果你的数组不仅仅是数字)。所以如果有JSON.stringify/parse可用,就使用它,否则[0,0,0].join(",")/"0,0,0".split(",")将起作用。

0

如果你想要它是一个字符串,我会使用 var velString = me.vel.join(',');

要将其转换回来:

var vel = velString.split(',');

for (var i = 0; i < vel.length; i++) {
    vel[i] = parseFloat(vel[i]);
}

或者,如果您知道您的用户只会使用现代浏览器:

var vel = velString.split(',').map(parseFloat)

我无法评论MySQL中更合适的数据类型。除非您预计将来记录更高维度的速度,否则似乎三个数字列可能更有意义。


1
你知道吗,不留下评论就对正确答案进行负评是一件相当反社会的事情。 - lawnsea

0
var vel = [0, 0, 0];
var vel_string = vel.join('|');

输出 0|0|0

如果你从数据库中得到的是一个字符串,你可以将它转换成数组:

var vel_string = '0|0|0';
var vel = vel_string.split('|');
for(var i in vel) {
    vel[i] = parseInt(vel[i]);
}

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接