แนวคิด
MD5 เป็นค่า Hexadecimal (ฐาน 16) 32 ตัวอักษร (128 bits) เพื่อแปลงเป็น Decimal (ฐาน 10) ต้อง:
1. แยกเป็น 2 ส่วน ครึ่งละ 16 ตัวอักษร (64 bits)
2. แปลงแต่ละส่วนจาก Hex เป็น Decimal ด้วย CONV()
3. รวมกันด้วยการคูณส่วนแรกด้วย 264 แล้วบวกส่วนที่สอง
ไวยากรณ์หลัก
CONV(string, from_base, to_base) -- แปลงฐานเลข
CAST(expr AS type) -- แปลงชนิดข้อมูล
ตัวอย่างสมบูรณ์
1. สร้างตารางและเพิ่มข้อมูล MD5
CREATE TABLE DemoTable (Password TEXT);
INSERT INTO DemoTable VALUES ('a5391e96f8d48a62e8c85381df108e98');
INSERT INTO DemoTable VALUES ('ea7a32d2dc5bb793af262dcb6ea1a54d');
2. Query แปลงเป็น Decimal
SELECT
CAST(CONV(SUBSTR(Password, 1, 16), 16, 10) AS DECIMAL(65)) * 18446744073709551616
+ CAST(CONV(SUBSTR(Password, 17, 16), 16, 10) AS DECIMAL(65))
AS DecimalValue
FROM DemoTable;
3. ผลลัพธ์
+-----------------------------------------+
| DecimalValue |
+-----------------------------------------+
| 219619200658969319114298942978912194200 |
| 311673842057003455136843080376797734221 |
+-----------------------------------------+
การทำงานของสูตร (Step-by-step)
-- MD5: a5391e96f8d48a62e8c85381df108e98
-- ส่วนที่ 1 (16 ตัวแรก): a5391e96f8d48a62
-- ส่วนที่ 2 (16 ตัวท้าย): e8c85381df108e98
-- CONV('a5391e96f8d48a62', 16, 10) = 11907624823744107106
-- CONV('e8c85381df108e98', 16, 10) = 16723892229154424472
-- สูตร: part1 * 2^64 + part2
-- 11907624823744107106 * 18446744073709551616 + 16723892229154424472
-- = 219619200658969319114298942978912194200
ฟังก์ชันที่ใช้
| ฟังก์ชัน | หน้าที่ |
|---|---|
| SUBSTR(str, pos, len) | 擷取 สตริงย่อย ตำแหน่ง pos ความยาว len |
| CONV(str, from_base, to_base) | แปลงฐานเลข (16→10) |
| CAST(expr AS DECIMAL(65)) | แปลงเป็นตัวเลขขนาดใหญ่ (65 หลัก) |
กรณีใช้งาน
- จัดเก็บ MD5 เป็นตัวเลขเพื่อ Index/Range Query ได้เร็วกว่า
- เปรียบเทียบค่า MD5 ด้วยตัวเลข
- Integration กับระบบที่ใช้ Numeric ID
ข้อควรระวัง
- DECIMAL(65) รองรับสูงสุด 65 หลัก พอสำหรับ 128-bit (สูงสุด ~39 หลัก)
- MySQL 8.0+ สามารถใช้
CAST(... AS UNSIGNED)ได้โดยตรงสำหรับ 64-bit แต่ 128-bit ต้องคำนวณเอง - Performance: การแปลงทุกครั้งอาจช้า ควรเก็บค่า Decimal ไว้แยกหาก Query บ่อย