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

MySQL: แปลงระบบเลขฐานหนึ่งไปอีกฐานหนึ่งด้วย CONV()

ฟังก์ชัน CONV() ใน MySQL ใช้แปลงตัวเลขจากระบบเลขฐานหนึ่ง (base) ไปอีกฐานหนึ่ง รองรับฐาน 2 ถึง 36

รูปแบบคำสั่ง

CONV(number, from_base, to_base)
  • number - ตัวเลขในรูปสตริง (ฐาน from_base)
  • from_base - ฐานต้นทาง (2-36)
  • to_base - ฐานปลายทาง (2-36)

ตัวอย่างการใช้งาน

1. สร้างตารางเก็บค่า Hexadecimal

CREATE TABLE castTypeToBigIntDemo (
    Id INT NOT NULL AUTO_INCREMENT,
    Value VARCHAR(100),
    PRIMARY KEY (Id)
);

INSERT INTO castTypeToBigIntDemo (Value) VALUES
('AB5'),
('55244A5562C5566354'),
('4546575765ABD78'),
('5979787DEFAB'),
('86868686856ABD');

2. แปลงจาก Hex (ฐาน 16) เป็น Decimal (ฐาน 10) แล้ว CAST เป็น UNSIGNED INTEGER

SELECT 
    CAST(CONV(Value, 16, 10) AS UNSIGNED INTEGER) AS BigNumber
FROM castTypeToBigIntDemo;

ผลลัพธ์:

+----------------------+
| BigNumber            |
+----------------------+
| 2741                 |
| 18446744073709551615 |
| 311985829366644088   |
| 98378247434155       |
| 37865559219858109    |
+----------------------+

ตัวอย่างการแปลงระหว่างฐานต่างๆ

คำสั่งความหมายผลลัพธ์
CONV('1010', 2, 10)Binary → Decimal10
CONV('10', 10, 2)Decimal → Binary1010
CONV('FF', 16, 10)Hex → Decimal255
CONV('255', 10, 16)Decimal → HexFF
CONV('10', 10, 8)Decimal → Octal12
CONV('Z', 36, 10)Base36 → Decimal35

การใช้งานกับคอลัมน์ตัวเลข

หากคอลัมน์เป็นตัวเลขแล้ว ต้องแปลงเป็นสตริงก่อน:

SELECT CONV(CAST(hex_col AS CHAR), 16, 10) FROM table_name;

ข้อจำกัด

  • ฐานรองรับ: 2 ถึง 36
  • ตัวอักษรในฐาน > 10 ใช้ A-Z (ไม่สนใจ case)
  • ผลลัพธ์เป็นสตริง ต้อง CAST หากต้องการตัวเลข
  • ค่าที่ใหญ่เกิน UNSIGNED BIGINT (18446744073709551615) จะได้ค่าสูงสุดและ warning

การประยุกต์: แปลง IP Address

-- IPv4 เป็นตัวเลข (Dot-decimal → Integer)
SELECT CONV(
    CONCAT(
        LPAD(SUBSTRING_INDEX(ip, '.', 1), 3, '0'),
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 2), '.', -1), 3, '0'),
        LPAD(SUBSTRING_INDEX(SUBSTRING_INDEX(ip, '.', 3), '.', -1), 3, '0'),
        LPAD(SUBSTRING_INDEX(ip, '.', -1), 3, '0')
    ), 10, 10) AS ip_int
FROM (SELECT '192.168.1.1' AS ip) t;

สำหรับ IP จริงควรใช้ INET_ATON() และ INET_NTOA() แทน