更新时间:2025-09-12 GMT+08:00
JSON类型
M-Compatibility支持的JSON类型请参见表1。
- JSON数据类型的输入合法校验不受GUC参数sql_mode影响。sql_mode为任意取值时,JSON类型列输入不合法的字符时,都会产生ERROR。
- JSON数据类型不支持作为主键和索引键以及作为分区键。
- 当插入JSON类型列的整数大于无符号整数类型最大值2^64 - 1或小于有符号整数类型最小值-2^63时,会作为DOUBLE类型存储,对精度会产生部分差异。
- 为了与GaussDB非M-Compatibility模式数据库(即GaussDB原有)的JSON类型区分,M-Compatibility模式数据库内新增GUC参数m_format_behavior_compat_options的兼容性选项cast_as_new_json。
- 该选项开启时,执行::JSON、CREATE TABLE <tablename> AS <包含JSON类型的SELECT查询>; 等涉及通过::JSON方式执行JSON类型转换的场景,实际转换为M-Compatibility模式数据库的JSON类型。
- 如果不开启该选项,相关JSON类型转换的场景实际转换为非M-Compatibility模式数据库(即GaussDB原有)的JSON类型。
- 该选项在数据库实例初始化后默认开启,但如果需要显式指定m_format_behavior_compat_options兼容性参数的值并使用M-Compatibility模式数据库内的JSON类型,为保证功能符合预期,需要补充设置cast_as_new_json参数。如:
SET m_format_behavior_compat_options = 'xxx,xxx,cast_as_new_json';
- 为了与原有的JSON类型区分,M-Compatibility中的JSON类型在pg_type系统表中的typname名称为“jsonm”。
- 在SQL语法中,JSON相当于JSONM的别名,但JSONM不可作为数据类型名称使用。
- “jsonm”字样可能会在错误信息等文本中出现,用户可将其看作JSON类型。
- pg_type系统表中typname名称为“json”和“jsonb”的数据类型为原有的JSON类型,在M-Compatibility中已废弃,请勿使用相关的内部函数,例如:“json_in”、“jsonb_in”等。
示例
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 |
-- 创建列类型为JSON数值类型的表。 m_db=# CREATE TABLE test_json (id INT, json_value JSON); CREATE TABLE -- 插入空类型标量 m_db=# INSERT INTO test_json VALUES(1, 'null'); INSERT 0 1 -- 插入数字类型标量 m_db=# INSERT INTO test_json VALUES(2, '-1.5e+2'); INSERT 0 1 -- 插入bool类型标量 m_db=# INSERT INTO test_json VALUES(3, 'true'); INSERT 0 1 m_db=# INSERT INTO test_json VALUES(4, 'false'); INSERT 0 1 -- 插入字符串类型标量 m_db=# INSERT INTO test_json VALUES(5, '"abc"'); INSERT 0 1 -- 插入数组 m_db=# INSERT INTO test_json VALUES(6, '[1, 2, "json", null, [[]], {}]'); INSERT 0 1 -- 插入对象 m_db=# INSERT INTO test_json VALUES(7, '{"jsnid": [true, "abc"], "tag": {"ab": 1, "b": null, "a": 2}}'); INSERT 0 1 -- 查询表中的数据 m_db=# SELECT * FROM test_json; id | json_value ----+--------------------------------------------------------------- 1 | null 2 | -150 3 | true 4 | false 5 | "abc" 6 | [1, 2, "json", null, [[]], {}] 7 | {"tag": {"a": 2, "b": null, "ab": 1}, "jsnid": [true, "abc"]} (7 rows) -- 非法输入报错 m_db=# INSERT INTO test_json VALUES(1, '+20'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, '+20'); ^ DETAIL: Token "+" is invalid. CONTEXT: JSON data, line 1: +... referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, 'NaN'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, 'NaN'); ^ DETAIL: Token "NaN" is invalid. CONTEXT: JSON data, line 1: NaN referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, 'inf'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, 'inf'); ^ DETAIL: Token "inf" is invalid. CONTEXT: JSON data, line 1: inf referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, 'NULL'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, 'NULL'); ^ DETAIL: Token "NULL" is invalid. CONTEXT: JSON data, line 1: NULL referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, 'TRUE'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, 'TRUE'); ^ DETAIL: Token "TRUE" is invalid. CONTEXT: JSON data, line 1: TRUE referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, '000123'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, '000123'); ^ DETAIL: Token "000123" is invalid. CONTEXT: JSON data, line 1: 000123 referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, 'abc'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, 'abc'); ^ DETAIL: Token "abc" is invalid. CONTEXT: JSON data, line 1: abc referenced column: json_value m_db=# INSERT INTO test_json VALUES(1, '{12:"abc"}'); ERROR: invalid input syntax for type json LINE 1: INSERT INTO test_json VALUES(1, '{12:"abc"}'); ^ DETAIL: Expected string or "}", but found "12". CONTEXT: JSON data, line 1: {12... referenced column: json_value -- 删除表 m_db=# DROP TABLE test_json; |
父主题: 数据类型