这是在sql中插入json的代码。
function insert_ema($json){
$a= new Sql();
$b=$a->connection;
$sql = "INSERT INTO ema (ema_ten) VALUES ('$json')";
if ($b->query($sql) === TRUE) {
echo PHP_EOL." New record created successfully \n";
} else {
echo PHP_EOL." Error: " . $sql . "<br>" . $b->error;
}
$b->close();
;}
insert_ema('{"firstName":"John", "lastName":"Doe","3":"Jo", "4":"Do"}');
+----------------------------------------------------------------+----+
| ema_ten | id |
+----------------------------------------------------------------+----+
| {"3": "Jo", "4": "Do", "lastName": "Doe", "firstName": "John"} | 1 |
| {"3": "Jo", "4": "Do", "lastName": "Doe", "firstName": "John"} | 2 |
+----------------------------------------------------------------+----+上面保存的sql是相反的顺序!!我怎样才能修好它?
我想要保持顺序的原因是,我希望能够将json转换为一个数组并使用pop。
我认为MySQL应该保存数组,并对这个问题进行排序。
发布于 2022-08-01 20:58:40
https://dev.mysql.com/doc/refman/8.0/en/json.html说:
为了提高查找效率,MySQL还对JSON对象的键进行排序。您应该注意到,这种排序的结果可能会发生更改,并且不能保证在各个版本之间保持一致。
这意味着您不应该依赖于JSON对象中键的任何特定排序顺序。JSON数组有顺序,但是JSON对象的键没有顺序。
如果JSON对象的键和各自的值相同,则JSON对象是相等的,不管顺序如何:
mysql> select cast('{"firstName":"John", "lastName":"Doe","3":"Jo", "4":"Do"}' as json)
= cast('{"3": "Jo", "4": "Do", "lastName": "Doe", "firstName": "John"}' as json)
as is_equal;
+----------+
| is_equal |
+----------+
| 1 |
+----------+关于你的评论:
以上示例的要点是,您不能按预定顺序使MySQL存储密钥。MySQL的JSON实现并不能做到这一点。它重新排列JSON对象键,使其更有效地进行查找。你在这件事上没有发言权。
可以对JSON数组进行排序。因此,保留顺序的唯一选项是使用数组,其中数组的每个元素都是一个具有单个键的对象:
[{"firstName":"John"}, {"lastName":"Doe"}, {"3":"Jo"}, {"4":"Do"}]我知道这不是您所要求的,而是您所要求的不能在MySQL中实现。
https://stackoverflow.com/questions/73199458
复制相似问题