Computer >> บทช่วยสอนคอมพิวเตอร์ >  >> การเขียนโปรแกรม >> MySQL

แปลงสตริง MD5 ที่จัดเก็บเป็นค่าทศนิยม (Decimal) ใน MySQL

แนวคิด

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 บ่อย