ฟังก์ชัน 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 → Decimal | 10 |
CONV('10', 10, 2) | Decimal → Binary | 1010 |
CONV('FF', 16, 10) | Hex → Decimal | 255 |
CONV('255', 10, 16) | Decimal → Hex | FF |
CONV('10', 10, 8) | Decimal → Octal | 12 |
CONV('Z', 36, 10) | Base36 → Decimal | 35 |
การใช้งานกับคอลัมน์ตัวเลข
หากคอลัมน์เป็นตัวเลขแล้ว ต้องแปลงเป็นสตริงก่อน:
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() แทน