當歷史系統將多個數值欄位打包存儲於單一 BLOB 欄位(如遊戲裝備屬性),需解析並拆分至獨立欄位以利查詢與索引。本文示範使用 HEX()、SUBSTR()、CONV() 三大函數完成十六進位解析與十進位轉換。

EquipmentInfo 表包含 EquipmentBlob 欄位,其中位元組 17、18、19 分別對應三顆寶石屬性值。
ALTER TABLE EquipmentInfo ADD Gem1 TINYINT UNSIGNED DEFAULT 0;
ALTER TABLE EquipmentInfo ADD Gem2 TINYINT UNSIGNED DEFAULT 0;
ALTER TABLE EquipmentInfo ADD Gem3 TINYINT UNSIGNED DEFAULT 0;
UPDATE EquipmentInfo
SET
Gem1 = CONV(SUBSTR(HEX(EquipmentBlob), 17, 2), 16, 10),
Gem2 = CONV(SUBSTR(HEX(EquipmentBlob), 19, 2), 16, 10),
Gem3 = CONV(SUBSTR(HEX(EquipmentBlob), 21, 2), 16, 10);
| 函數 | 作用 | 範例 |
|---|---|---|
HEX(blob) | 將二進位 BLOB 轉為十六進位字串(每位元組 2 字元) | HEX(0x12AB) → '12AB' |
SUBSTR(str, pos, len) | 從位置 pos(1-based)擷取長度 len 的子字串 | SUBSTR('12AB34', 3, 2) → 'AB' |
CONV(N, from_base, to_base) | 進位制轉換:從 from_base 轉至 to_base | CONV('FF', 16, 10) → 255 |
HEX() 後每位元組佔 2 字元(17-1)*2 + 1 = 33?實際範例中直接使用 17,表示原始設計可能已含頭部資訊,需依實際結構調整。SELECT EquipmentBlob,
HEX(EquipmentBlob) AS hex_blob,
CONV(SUBSTR(HEX(EquipmentBlob), 17, 2), 16, 10) AS gem1_val,
Gem1, Gem2, Gem3
FROM EquipmentInfo LIMIT 10;
Gem1、Gem2、Gem3 索引支援後續查詢