MySQL支持JSON数据类型。相比于Json格式的字符串类型,JSON数据类型的优势有: 存储在JSON列中的任何JSON文档的大小都受系统变量 max_allowed_packet 的值的限制,可以使用 JSON_STORAGE_SIZE() 函数获得存储JSON文档所需的空间。 在MySQL8.0中,优化器可以执行JSON列的局部就地更新,而不用删除旧文档再将整个新文档写入该列。局部更新的条件: JSON数组包含在 字符 [ 和 ] 字符中,其中为一个由逗号分隔的值列表: JSON对象包含在字符 { 和 } 字符中,其中为一组由逗号分隔的键值对,键必须是字符串: 在JSON数组和JSON对象的值中允许嵌套: 下例中向创建一个只有一个JSON列的表格 t_json ,并向其中添加JSON值: 若添加的值为非JSON格式,则报错: 查看 t_json : 如果传入的参数不能组成键值对,则报错: 因此我们也可以使用以上三种方法向表中添加JSON值,可以一定程度地避免输入格式错误: 解析字符串并发现字符串是有效的JSON文档时,它在被解析时也会被规范化。对于重复的键( key ),后面的值( value )会覆盖前面的值。如下: 这种“覆盖”在向JSON列添加值时也会发生。 在MySQL8.0.3之前的版本中,与此相反,对于被重复的键,它的第一个值会被保留,后添加的值则会被抛弃。 MySQL8.0.3及更高版本中,有两种合并函数: JSON_MERGE_PRESERVE() 和 JSON_MERGE_PATCH() 。下面具讨论它们的区别。 合并数组时, JSON_MERGE_PRESERVE 只保留最后传入的数组参数,而 JSON_MERGE_PRESERVE 则按传入顺序将数组参数连接。 合并对象时,对于重复键, JSON_MERGE_PRESERVE 只保留最后传入的键值,而 JSON_MERGE_PRESERVE 重复键的所有值保留为数组。 在了解搜索和修改JSON值之前,先来看看JSON的路径语法。 JSON_EXTRACT 提取JSON值,直接看例子: JSON_REPLACE 与 JSON_SET 的区别: JSON_INSERT 和 JSON_SET : JSON_REMOVE : 可以使用 = , < , <= , > , >= , <> , != ,和 <=> 对JSON值进行比较。 JSON值的比较先比较值的类型。如果类型不同,则直接 返回类型的优先级的比较结果;如果类型相同,再进行值的内容的比较。 OPAQUE 值是不属于其他类型的值。 转换规则为: