คำตอบ: ใช่ เก็บได้
ค่าสี CSS hex format (เช่น #FF0000) เก็บใน MySQL ได้หลายวิธี
วิธีที่ 1: CHAR(6) - ไม่เก็บ # (แนะนำสำหรับ fixed length)
รูปแบบ
CREATE TABLE colors ( color_code CHAR(6) NOT NULL );
ตัวอย่าง
mysql> create table storeCSSColorDemo
-> (
-> CSSValue char(6)
-> );
Query OK, 0 rows affected (0.53 sec)
mysql> insert into storeCSSColorDemo values('FF0000'); -- Red
Query OK, 1 row affected (0.13 sec)
mysql> insert into storeCSSColorDemo values('FFA500'); -- Orange
Query OK, 1 row affected (0.86 sec)
mysql> insert into storeCSSColorDemo values('FFFF00'); -- Yellow
Query OK, 1 row affected (0.19 sec)
mysql> select * from storeCSSColorDemo;
+----------+ | CSSValue | +----------+ | FF0000 | | FFA500 | | FFFF00 | +----------+
วิธีที่ 2: VARCHAR(7) - เก็บรวม # (เหมาะ nullable)
CREATE TABLE colors ( color_code VARCHAR(7) -- #FF0000 );
ตัวอย่าง
INSERT INTO colors VALUES ('#FF0000'), ('#00FF00'), ('#0000FF'), (NULL);
วิธีที่ 3: INT UNSIGNED - เก็บเป็นตัวเลข (ประหยัด space, เร็วสุด)
CREATE TABLE colors ( color_value INT UNSIGNED NOT NULL -- 0xFF0000 = 16711680 );
Insert/Select
INSERT INTO colors VALUES (0xFF0000), (0x00FF00), (0x0000FF);
SELECT CONCAT('#', LPAD(HEX(color_value), 6, '0')) AS hex_color FROM colors;
+------------+ | hex_color | +------------+ | #FF0000 | | #00FF00 | | #0000FF | +------------+
เปรียบเทียบ
| Type | Storage | Pros | Cons |
|---|---|---|---|
| CHAR(6) | 6 bytes | Fixed length, เร็ว, ไม่เก็บ # | ต้อง concat # ตอนแสดง |
| VARCHAR(7) | 1-8 bytes | เก็บ # ไว้, nullable | Variable length overhead |
| INT UNSIGNED | 4 bytes | เล็กที่สุด, เร็วสุด, index ดี | ต้อง convert hex↔int |
| BINARY(3) | 3 bytes | เล็กที่สุด (3 bytes = 24 bits) | อ่านยาก, ต้อง UNHEX() |
Application Level: Validation
-- Trigger validate hex color
CREATE TRIGGER validate_color
BEFORE INSERT ON colors
FOR EACH ROW
BEGIN
IF NEW.color_code NOT REGEXP '^[0-9A-Fa-f]{6}$' THEN
SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = 'Invalid hex color';
END IF;
END;
CSS Named Colors
หากต้องการเก็บ named colors (red, blue, transparent) ใช้ VARCHAR(20) แทน
สรุป: CHAR(6) สำหรับ hex only, VARCHAR(7) สำหรับ hex+#, INT UNSIGNED สำหรับ performance คู่อันดับ 1