1. 程式人生 > 實用技巧 >人大金倉 TEXT 轉 JSON 最方便的方式

人大金倉 TEXT 轉 JSON 最方便的方式

之前負責的一個專案有使用到 mysql JSON 欄位的列,直接通過金倉資料庫提供的遷移工具會導致 JSON 對映的列內的中文字元編碼亂碼,這裡提供一個本人測試過的思路解決該問題。

  1. 備份一份需要遷移的 mysql 資料庫。
  2. 將需要轉換的 mysql 資料庫的列從 JSON 型別改為 TEXT 型別。
  3. 使用資料庫遷移工具執行 mysql 到 金倉的資料庫的遷移工作。
  4. 對遷移後的資料列執行 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 型別中記錄鍵值重複是允許的。