更新时间:2025-06-30 GMT+08:00

JSON类型

表1 JSON数据类型

数据类型

与MySQL的差异

JSON

GaussDB支持JSON数据类型与MySQL相比,规格存在如下差异:

  • 取值范围:

    在MySQL中,JSON数据类型的最大长度为4GB,但在GaussDB中,JSON数据类型的最大长度为1GB-512字节,对象的键值对个数最大值和数组的元素个数最大值也小于MySQL。

  • 字符序差异:

    在MySQL中,使用collation函数单独查询JSON类型的列,返回的字符序是BINARY,但GaussDB中返回utf8mb4_bin。其他使用的场景都使用utf8mb4_bin,与MySQL相同。

  • 使用ORDER BY在非标量JSON类型行为上的差异:

    在MySQL中,使用ORDER BY对非标量JSON类型排序的行为不做规定,会存在不支持对非标量JSON类型排序的告警。

    在GaussDB中,支持对非标量的JSON进行排序,并按照一定的排序规则进行排序:

    • 首先比较JSON数据的类型,OPAQUE > TIMESTAMP = DATETIME > TIME > DATE > BOOL > 数组 > 对象 > 字符串类型 > DOUBLE = UINT = INT = DECIMAL > NULL,结果相等则比较内容。
    • 标量之间比较值的大小,OPAQUE先进行类型之间的比较,TYPE_STRING > TYPE_VAR_STRING > TYPE_BLOB > TYPE_BIT > TYPE_VARCHAR > TYPE_YEAR,类型相同时依次比较每个字节的大小。
    • 数组之间依次比较元素的大小,当其中一个数组的元素比较完成之后,则元素个数多的大。对象之间比较长度,长度相等则依次比较每个键值对,先比较键key,再比较值value。
  • 在GaussDB中,BLOB、TINYBLOB、MEDIUMBLOB、LONGBLOB、BINARY、VARBINARY、BIT以及YEAR类型转换为JSON类型,结果与MySQL不同。

    示例:

    -- GaussDB
    m_db=# CREATE TABLE test_blob (c1 BLOB, c2 TINYBLOB, c3 MEDIUMBLOB, c4 LONGBLOB, c5 BINARY(32), c6 VARBINARY(100), c7 BIT(64), c8 YEAR);
    CREATE TABLE
    m_db=# INSERT INTO test_blob VALUES('[1, "json"]', 'true', 'abc', '{"jsnid": 1, "tag": "ab"}', '[1, "json"]', '{"jsnid": 1, "tag": "ab"}', '20', '2020');
    INSERT 0 1
    m_db=# SELECT CAST(c1 AS JSON), CAST(c2 AS JSON), CAST(c3 AS JSON), CAST(c4 AS JSON), CAST(c5 AS JSON), CAST(c6 AS JSON), CAST(c7 AS JSON), CAST(c8 AS JSON) FROM test_blob;
          CAST       |  CAST  | CAST  |               CAST                |                 CAST                 |               CAST                | CAST |  CAST  
    -----------------+--------+-------+-----------------------------------+--------------------------------------+-----------------------------------+------+--------
     "[1, \"json\"]" | "true" | "abc" | "{\"jsnid\": 1, \"tag\": \"ab\"}" | "[1, \"json\"]                     " | "{\"jsnid\": 1, \"tag\": \"ab\"}" | "20" | "2020"
    (1 row)
    m_db=# DROP TABLE test_blob;
    DROP TABLE
    
    -- MySQL
    mysql> CREATE TABLE test_blob (c1 BLOB, c2 TINYBLOB, c3 MEDIUMBLOB, c4 LONGBLOB, c5 BINARY(32), c6 VARBINARY(100), c7 BIT(64), c8 YEAR);
    Query OK, 0 rows affected (0.02 sec)
    mysql> INSERT INTO test_blob VALUES('[1, "json"]', 'true', 'abc', '{"jsnid": 1, "tag": "ab"}', '[1, "json"]', '{"jsnid": 1, "tag": "ab"}', '20', '2020');
    Query OK, 1 row affected (0.00 sec)
    mysql> SELECT CAST(c1 AS JSON), CAST(c2 AS JSON), CAST(c3 AS JSON), CAST(c4 AS JSON), CAST(c5 AS JSON), CAST(c6 AS JSON), CAST(c7 AS JSON), CAST(c8 AS JSON) FROM test_blob;
    +-----------------------------------+---------------------------+-----------------------+-------------------------------------------------------+---------------------------------------------------------------+------------------------------------------------------+------------------------------+--------------------------+
    | CAST(c1 AS JSON)                  | CAST(c2 AS JSON)          | CAST(c3 AS JSON)      | CAST(c4 AS JSON)                                      | CAST(c5 AS JSON)                                              | CAST(c6 AS JSON)                                     | CAST(c7 AS JSON)             | CAST(c8 AS JSON)         |
    +-----------------------------------+---------------------------+-----------------------+-------------------------------------------------------+---------------------------------------------------------------+------------------------------------------------------+------------------------------+--------------------------+
    | "base64:type252:WzEsICJqc29uIl0=" | "base64:type249:dHJ1ZQ==" | "base64:type250:YWJj" | "base64:type251:eyJqc25pZCI6IDEsICJ0YWciOiAiYWIifQ==" | "base64:type254:WzEsICJqc29uIl0AAAAAAAAAAAAAAAAAAAAAAAAAAAA=" | "base64:type15:eyJqc25pZCI6IDEsICJ0YWciOiAiYWIifQ==" | "base64:type16:AAAAAAAAMjA=" | "base64:type13:MjAyMA==" |
    +-----------------------------------+---------------------------+-----------------------+-------------------------------------------------------+---------------------------------------------------------------+------------------------------------------------------+------------------------------+--------------------------+
    1 row in set (0.00 sec)
    mysql> DROP TABLE test_blob;
    Query OK, 0 rows affected (0.01 sec)
  • 如果在当前版本内执行了::JSON强制类型转换,其实际转换的JSON类型与GUC参数m_format_behavior_compat_options兼容性选项是否设置了cast_as_new_json有关。