在 JSON 和非 JSON 值之间转换
下表提供了MySQL在JSON值和其他类型的值之间转换时遵循的规则的摘要:
表 11.3 JSON 转换规则
其他类型 | CAST(其他类型为 JSON) | CAST(JSON AS OTHER TYPE) |
---|---|---|
断续器 | 无变化 | 无变化 |
utf8 字符类型 (, ,utf8mb4 utf8 ascii ) | 该字符串将解析为 JSON 值。 | JSON 值将序列化为字符串。utf8mb4 |
其他字符类型 | 其他字符编码将隐式转换为 utf8 字符类型并按照其描述进行处理。utf8mb4 | JSON 值被序列化为字符串,然后转换为其他字符编码。结果可能没有意义。utf8mb4 |
NULL | 生成类型为 JSON 的值。NULL | 不適用。 |
几何类型 | 几何值通过调用ST_AsGeoJSON()转换为 JSON 文档。 | 非法操作。解决办法:将CAST(json_val为 CHAR)的结果传递给ST_GeomFromGeoJSON()。 |
所有其他类型的 | 生成由单个标量值组成的 JSON 文档。 | 如果 JSON 文档由目标类型的单个标量值组成,并且该标量值可以强制转换为目标类型,则成功。否则,将返回并生成警告。NULL |
ORDER BY
对于 JSON 值,它们的工作原理如下:GROUP BY
-
标量 JSON 值的排序使用与前面讨论中相同的规则。
-
对于升序排序,SQL在所有JSON值之前排序,包括JSON空文本;对于降序排序,SQL 在所有 JSON 值(包括 JSON 空文本)之后排序。
NULL
NULL
-
JSON 值的排序键由max_sort_length系统变量的值绑定,因此仅在第一个max_sort_length字节之后不同的键将进行比较。
-
当前不支持对非标量值进行排序,并且会出现警告。
对于排序,将 JSON 标量转换为其他一些本机 MySQL 类型可能是有益的。例如,如果名为 的列包含具有由键和非负值组成的成员的 JSON 对象,请使用以下表达式按值排序:jdoc
id
id
ORDER BY CAST(JSON_EXTRACT(jdoc, '$.id') AS UNSIGNED)
如果碰巧有一个生成的列被定义为使用与 中相同的表达式,MySQL优化器会认识到这一点,并考虑将索引用于查询执行计划。请参见第 8.3.11 节 "生成的列索引的优化器使用"。ORDER BY
对于 JSON 值的聚合,将像其他数据类型一样忽略 SQL 值。非值将转换为数值类型并进行聚合,但 MIN()、 MAX()和GROUP_CONCAT() 除外。对于作为数字标量的 JSON 值,转换为数字应产生有意义的结果,尽管(取决于值)可能会发生截断和精度损失。转换为其他 JSON 值的数量可能不会产生有意义的结果。NULL
NULL