写入 MySQL 5.7 表 的 json 列类型下的数据的键顺序被打乱的排查分析
1、json 数据的原始格式如下。其键名的顺序如下:TexGEtcUx、QkGyGZ2ST、yE9gC1kxT、Q1yqz2RBi。如图1
{
"sections": {
"TexGEtcUx": {
"type": "main-index-carousel",
"settings": {
"loop": true,
"autoplay": true,
"height": "full",
"interval": 5
},
"blocks": {
"slide-0": {
"type": "slide",
"settings": {
"image": "",
"url": "/",
"align": "center",
"title": "Image with text overlay",
"description": "Use overlay text to give your customers insight into your brand. Select imagery and text that relates to your style and story.",
"button": "Shop Now",
"opacity": 100,
"button_background_color": "#ffffff",
"button_color": "#000000",
"color": "#ffffff"
}
},
"slide-1": {
"type": "slide",
"settings": {
"image": "",
"url": "/",
"align": "center",
"title": "Image with text overlay",
"description": "Use overlay text to give your customers insight into your brand. Select imagery and text that relates to your style and story.",
"button": "Shop Now",
"opacity": 100,
"button_background_color": "#ffffff",
"button_color": "#000000",
"color": "#ffffff"
}
}
}
},
"QkGyGZ2ST": {
"type": "collections"
},
"yE9gC1kxT": {
"type": "products"
},
"Q1yqz2RBi": {
"type": "apps",
"blocks": {
"newsletter": {
"type": "internal/newsletter/blocks/newsletter"
}
}
}
}
}
2、执行插入数据库的代码如下,打印 $extra[‘schema’]
$asset = ThemeAsset::withoutVersion(function () use($predicate, $extra) {
if ($predicate['asset_key'] == 'pages/index.blade.php') {
print_r($extra['schema']);
exit;
}
return ThemeAsset::updateOrCreate(
$predicate,
$extra
);
});
3、打印 $extra[‘schema’] ,其等于 json 数据的原始格式 。如图2
{
"sections": {
"TexGEtcUx": {
"type": "main-index-carousel",
"settings": {
"loop": true,
"autoplay": true,
"height": "full",
"interval": 5
},
"blocks": {
"slide-0": {
"type": "slide",
"settings": {
"image": "",
"url": "/",
"align": "center",
"title": "Image with text overlay",
"description": "Use overlay text to give your customers insight into your brand. Select imagery and text that relates to your style and story.",
"button": "Shop Now",
"opacity": 100,
"button_background_color": "#ffffff",
"button_color": "#000000",
"color": "#ffffff"
}
},
"slide-1": {
"type": "slide",
"settings": {
"image": "",
"url": "/",
"align": "center",
"title": "Image with text overlay",
"description": "Use overlay text to give your customers insight into your brand. Select imagery and text that relates to your style and story.",
"button": "Shop Now",
"opacity": 100,
"button_background_color": "#ffffff",
"button_color": "#000000",
"color": "#ffffff"
}
}
}
},
"QkGyGZ2ST": {
"type": "collections"
},
"yE9gC1kxT": {
"type": "products"
},
"Q1yqz2RBi": {
"type": "apps",
"blocks": {
"newsletter": {
"type": "internal/newsletter/blocks/newsletter"
}
}
}
}
}
4、查看写入表中的数据,怀疑其 json 的键的顺序是基于字母顺序排列的。Q1yqz2RBi、QkGyGZ2ST、TexGEtcUx、yE9gC1kxT。而且其内部的子 json 结构的键的顺序也发生了变化。
{
"sections": {
"Q1yqz2RBi": {
"type": "apps",
"blocks": {
"newsletter": {
"type": "internal/newsletter/blocks/newsletter"
}
}
},
"QkGyGZ2ST": {
"type": "collections"
},
"TexGEtcUx": {
"type": "main-index-carousel",
"blocks": {
"slide-0": {
"type": "slide",
"settings": {
"url": "/",
"align": "center",
"color": "#ffffff",
"image": "",
"title": "Image with text overlay",
"button": "Shop Now",
"opacity": 100,
"description": "Use overlay text to give your customers insight into your brand. Select imagery and text that relates to your style and story.",
"button_color": "#000000",
"button_background_color": "#ffffff"
}
},
"slide-1": {
"type": "slide",
"settings": {
"url": "/",
"align": "center",
"color": "#ffffff",
"image": "",
"title": "Image with text overlay",
"button": "Shop Now",
"opacity": 100,
"description": "Use overlay text to give your customers insight into your brand. Select imagery and text that relates to your style and story.",
"button_color": "#000000",
"button_background_color": "#ffffff"
}
}
},
"settings": {
"loop": true,
"height": "full",
"autoplay": true,
"interval": 5
}
},
"yE9gC1kxT": {
"type": "products"
}
}
}
5、修改表列的类型为 text 后,json 的顺序与原始的保持一致。如图3

![打印 $extra['schema'] ,其等于 json 数据的原始格式](https://www.shuijingwanwq.com/wp-content/uploads/2022/09/2-6.png)

近期评论