没有不值得去解决的问题,也没有不值得去学习的技术!

写入 MySQL 5.7 表 的 json 列类型下的数据的键顺序被打乱的排查分析

打印 $extra['schema'] ,其等于 json 数据的原始格式

作者:

, , ,
1、json 数据的原始格式如下。其键名的顺序如下:TexGEtcUx、QkGyGZ2ST、yE9gC1kxT、Q1yqz2RBi。如图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
打印 $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
修改表列的类型为 text 后,json 的顺序与原始的保持一致
图3

需要长期技术维护或远程问题排查?

我是拥有 15+ 年经验的 PHP / Go 后端工程师,长期关注已有系统维护、Bug 修复、性能优化、服务器排查、WordPress 网站维护和小功能迭代。

如果你的项目遇到以下情况,可以先从一次小问题排查开始合作:

  • ✅ PHP / Laravel / Yii2 老项目无人维护
  • ✅ Go / Gin 后端接口需要排查或优化
  • ✅ WordPress 网站访问慢、报错或插件冲突
  • ✅ Nginx / MySQL / Redis / Linux 服务器异常
  • ✅ CDN / Cloudflare / DNS / HTTPS 配置问题
  • ✅ 需要长期远程技术支持或兼职维护

更多介绍请查看:关于我 & 合作

微信:13980074657
邮箱:shuijingwanwq@gmail.com
Telegram:@shuijingwan
GitHub:https://github.com/shuijingwan

评论

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注

这个站点使用 Akismet 来减少垃圾评论。了解你的评论数据如何被处理