DESC table 獲取欄位名CONCAT_WS 表達式,構建 JSON 字串:{"col1":"val1","col2":"val2"}NULL 與空字串 → 輸出 null(無引號)}#!/bin/bash mysql -s -phello test > 1.log <三、測試數據與輸出
表
t1:+------+-------+ | id | name | +------+-------+ | 1 | | | 1 | NULL | | 2 | hello | +------+-------+腳本產出的 SQL 片段:
concat_ws(',',concat_ws(':','{"id"',if(id is null or id='','null',concat('"',id,'"'))),concat_ws(':','"name"',if(name is null or name='','null}',concat('"',name,'"}'))))在 MySQL 執行:
SELECT concat_ws(',',concat_ws(':','{"id"',if(id is null or id='','null',concat('"',id,'"'))),concat_ws(':','"name"',if(name is null or name='','null}',concat('"',name,'"}')))) json_format FROM t1; +---------------------------+ | json_format | +---------------------------+ | {"id":"1","name":null} | | {"id":"1","name":null} | | {"id":"2","name":"hello"} | +---------------------------+四、Shell 引號轉義核心技巧
引號類型 特性 典型陷阱 單引號 '...' 保持所有字符字面值,含 \、換行、$、反引號。不能嵌套單引號 變數不展開、命令替換不執行 雙引號 "..." 保持字面值,但 $var、\`cmd\`、\$、\`、\"、\\ 保留特殊含義 需轉義內層雙引號: \"腳本中關鍵轉義說明
'{\"$col\"}':外層單引號保護整體,內層\"在單引號中屬字面值,最終傳給 MySQL 為{"id"}concat('\"',\$col,'\"'):MySQL 字串拼接雙引號包裹欄位值\$col:Shell 層轉義 $,防止 Shell 展開,保留$col交給 MySQL 解析為欄位引用五、改進建議
- 生產環境建議使用
jq、Pythonjson模組或 MySQL 5.7+ 內建JSON_OBJECT()、JSON_ARRAYAGG()直接輸出標準 JSON- 腳本僅供舊版本 MySQL 或無額外工具環境下應急使用