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

Troubleshooting Shuffled Key Order When Writing Data to a JSON Column in MySQL 5.7

Print $extra['schema'], which equals the original format of the json data

作者:

在

, , ,

1. The original format of the json data is as follows. The order of its keys is: TexGEtcUx, QkGyGZ2ST, yE9gC1kxT, Q1yqz2RBi. As shown in Figure 1

The original format of the json data is as follows. The order of its keys is: TexGEtcUx, QkGyGZ2ST, yE9gC1kxT, Q1yqz2RBi
Figure 1
JSON

{
  "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. Execute the code to insert into the database as follows, printing $extra[‘schema’]

PHP

$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. Print $extra[‘schema’], which equals the original format of the json data. As shown in Figure 2

Print $extra['schema'], which equals the original format of the json data
Figure 2
JSON

{
  "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. View the data written to the table, and I suspect that the order of its json keys is based on alphabetical order: Q1yqz2RBi, QkGyGZ2ST, TexGEtcUx, yE9gC1kxT. Moreover, the key order of its internal sub-json structure has also changed.

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. After changing the table column type to text, the order of the json remains consistent with the original. As shown in Figure 3

After changing the table column type to text, the order of the json remains consistent with the original
Figure 3

关于作者 · 持续学习与技术实践

我是一名拥有 15 年以上开发经验的技术从业者,自 2013 年起持续运营个人技术博客,记录工作与个人项目中遇到的真实问题,以及解决问题过程中的探索、实践和思考。

除了技术写作,我也在持续开发和维护自己的独立项目,探索新技术和新工具在实际场景中的应用。我始终相信,没有不值得去解决的问题,也没有不值得去学习的技术。

如果这篇文章对你有所帮助,欢迎浏览博客中的其他文章,也欢迎交流技术经验与想法。

关于我  ·  GitHub  ·  邮件联系