
# JSON数据类型
表1JSON数据类型 
| 数据类型 | 与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。     |
   
![](https://support.huaweicloud.com/usermanual-ugo/public_sys-resources/note_3.0-zh-cn.png)
- 在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有关。
 
