iT邦幫忙

2025 iThome 鐵人賽

DAY 11
1
Software Development

我所不知道的PostgreSQL 30天系列 第 11

Day 11: json 和 jsonb 如何處理 Unicode escape 字元?

  • 分享至 

  • xImage
  •  

json

  • 允許存 Unicode escape 字元(\uXXXX),且不管資料庫會編碼成什麼字,只要 escape 格式正確(四個十六進位數字)就可以存進去。
  • 也就是說,即使資料庫編碼不支援某些 Unicode 字元,還是可以把資料存入 json 欄位,只檢查語法正確性,不檢查 Unicode 字元是否可以被正確編碼。

jsonb

  • 允許 Unicode escape 字元(\uXXXX),但 jsonb 檢查比較嚴謹,如果 Unicode 字元無法被資料庫編碼, jsonb 會拒絕存入。
  • 特別是 \u0000( null 字元)會被拒絕,因為 PostgreSQL 的 text 型態不能接受 null 字元。

至於什麼是只檢查語法正確性,不檢查 Unicode 字元是否可以被正確編碼呢?舉例來說,在資料庫裡面分別對 jsonjsonb 欄位塞入一模一樣的 JSON 資料。

-- 插入使用 Unicode escape 字元
INSERT INTO test_json (data_json, data_jsonb) VALUES 
('{"name": "\u4e2d\u83ef", "emoji": "\ud83d\ude00"}', '{"name": "\u4e2d\u83ef", "emoji": "\ud83d\ude00"}');

查詢的時候可以發現, json 的欄位會直接呈現Unicode escape 字元, jsonb 會呈現編碼之後的樣子,這就是兩個欄位型別在處理 Unicode 上的差別,其實這種差別,也跟上一篇說到的 number 型別差異有異曲同工之妙。


上一篇
Day 10: json 和 jsonb 資料型態的差異和索引
下一篇
Day 12: 簡介 Window Functions 和比較與 Group By 的差異
系列文
我所不知道的PostgreSQL 30天30
圖片
  熱門推薦
圖片
{{ item.channelVendor }} | {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言