人大金仓 TEXT 转 JSON 最方便的方式
之前负责的一个项目有使用到 mysql JSON 字段的列,直接通过金仓数据库提供的迁移工具会导致 JSON 映射的列内的中文字符编码乱码,这里提供一个本人测试过的思路解决该问题。
- 备份一份需要迁移的 mysql 数据库。
- 将需要转换的 mysql 数据库的列从 JSON 类型改为 TEXT 类型。
- 使用
数据库迁移工具
执行 mysql 到 金仓的数据库的迁移工作。 - 对迁移后的数据列执行 JSON 转换,具体的 TEXT 到 JSON 转换语句为
ALTER TABLE <表名> ALTER COLUMN <列名> TYPE JSON USING <列名>::JSON;
。
如此一来间接的转换后就不会发生 JSON 列内中文乱码问题了。
具体乱码原因为数据库迁移工具缺少针对 JSON 转换的中文编码处理。
之前人大金仓的工程师是通过 mysql 导出为中间表 csv 的形式之后,再通过 csv 导入到 金仓数据库,非常麻烦,而且如果文件很大导出工作可能会很困难。
其他说明,关于 PostgreSQL 中的语句 ALTER TABLE <表名> ALTER COLUMN <列名> TYPE JSON USING <列名>::JSON;
关于 PostgreSQL 中的 JSON 和 JSONB 区别如下:
jsonb 类型的输出是对输入的内容进行了重新格式化,并删掉了输入时文本
中的空白。此外,插入记录时属性字段的顺序信息是不保留的。
jsonb 比 json 多支持的运算符有以下几个:等值判定运算符(=)、包含关系判定运算符
(@>)、被包含关系判定运算符(<@)、键值存在判定运算符(?)、判定一组键值中是否有任
意一个已存在的运算符(?|),以及判定一组键值中的每一个是否均已存在的运算符(?&)。
jsonb 类型的字段上可以直接建立 GIN 索引
jsonb 不允许其内部记录的键值重复,如果出现重复则会从中自动选择一条,其余的
重复记录会被丢弃,但 json 类型中记录键值重复是允许的。