เมื่อต้องการ Query แถวที่ความยาวข้อความเท่ากับค่าที่กำหนด ใช้ CHAR_LENGTH() (นับตัวอักษร) หรือ LENGTH() (นับ Byte)
ความแตกต่าง CHAR_LENGTH vs LENGTH
| ฟังก์ชัน | นับ | ตัวอักษร ASCII | ตัวอักษรไทย/Unicode |
|---|---|---|---|
CHAR_LENGTH(str) / CHARACTER_LENGTH(str) | จำนวน Character (Code Points) | 1 Char = 1 | 1 Char = 1 (แม้ใช้ 3 Bytes) |
LENGTH(str) / OCTET_LENGTH(str) | จำนวน Byte | 1 Char = 1 Byte | 1 Char = 3 Bytes (UTF-8) |
รูปแบบคำสั่ง
Case 1: CHAR_LENGTH() - นับตัวอักษร (แนะนำส่วนใหญ่)
SELECT * FROM yourTableName
WHERE CHAR_LENGTH(yourColumnName) = specific_length;
Case 2: LENGTH() - นับ Byte
SELECT * FROM yourTableName
WHERE LENGTH(yourColumnName) = specific_byte_length;
ตัวอย่างการใช้งาน
1. สร้างตารางและเพิ่มข้อมูล
mysql> CREATE TABLE StringWithSpecificLength (
-> Id INT,
-> Name VARCHAR(100),
-> FavouriteLanguage VARCHAR(50)
-> );
Query OK, 0 rows affected (0.52 sec)
mysql> INSERT INTO StringWithSpecificLength VALUES
-> (1, 'John', 'Java'),
-> (2, 'Bob', 'PHP'),
-> (3, 'Carol', 'Python'),
-> (4, 'Sam', 'Ruby'),
-> (5, 'Mike', 'Pascal');
2. ดูข้อมูล
mysql> SELECT * FROM StringWithSpecificLength;
+------+-------+-------------------+
| Id | Name | FavouriteLanguage |
+------+-------+-------------------+
| 1 | John | Java |
| 2 | Bob | PHP |
| 3 | Carol | Python |
| 4 | Sam | Ruby |
| 5 | Mike | Pascal |
+------+-------+-------------------+
5 rows in set (0.00 sec)
3. ค้นหาภาษาที่มีความยาว 6 ตัวอักษร
mysql> SELECT * FROM StringWithSpecificLength
-> WHERE CHAR_LENGTH(FavouriteLanguage) = 6;
+------+-------+-------------------+
| Id | Name | FavouriteLanguage |
+------+-------+-------------------+
| 3 | Carol | Python |
| 5 | Mike | Pascal |
+------+-------+-------------------+
2 rows in set (0.00 sec)
ตัวอย่างภาษาไทย (Multi-byte)
mysql> CREATE TABLE ThaiDemo (text_col VARCHAR(100) CHARSET utf8mb4);
mysql> INSERT INTO ThaiDemo VALUES ('Go'), ('GoGo'), ('GoGoGo'), ('ไทย'), ('ไทยไทย');
mysql> SELECT text_col, CHAR_LENGTH(text_col) AS chars, LENGTH(text_col) AS bytes
-> FROM ThaiDemo;
+-----------+-------+-------+
| text_col | chars | bytes |
+-----------+-------+-------+
| Go | 2 | 2 |
| GoGo | 4 | 4 |
| GoGoGo | 6 | 6 |
| ไทย | 2 | 6 |
| ไทยไทย | 4 | 12 |
+-----------+-------+-------+
5 rows in set (0.00 sec)
กรณีใช้งานจริง
Validation: รหัสไปรษณีย์ 5 หลัก
SELECT * FROM addresses WHERE CHAR_LENGTH(zip_code) = 5 AND zip_code REGEXP '^[0-9]{5}$';
หาข้อมูลผิดปกติ (Anomaly Detection)
-- ชื่อสั้นผิดปกติ (< 2 chars)
SELECT * FROM users WHERE CHAR_LENGTH(name) < 2;
-- Bio ยาวผิดปกติ (> 500 chars)
SELECT * FROM profiles WHERE CHAR_LENGTH(bio) > 500;
Statistics: ความยาวเฉลี่ย/สูงสุด/ต่ำสุด
SELECT
AVG(CHAR_LENGTH(description)) AS avg_len,
MAX(CHAR_LENGTH(description)) AS max_len,
MIN(CHAR_LENGTH(description)) AS min_len
FROM products;
Index และประสิทธิภาพ
WHERE CHAR_LENGTH(col) = 6→ **ไม่ใช้ Index ได้** (Function on Column)- หาก Query บ่อย → เพิ่ม Generated Column + Index:
ALTER TABLE products
ADD COLUMN desc_len INT GENERATED ALWAYS AS (CHAR_LENGTH(description)) STORED,
ADD INDEX idx_desc_len (desc_len);
-- ใช้งาน
SELECT * FROM products WHERE desc_len = 6;
สรุป
- ใช้
CHAR_LENGTH()สำหรับ Logic ทั่วไป (นับตัวอักษร) - ใช้
LENGTH()สำหรับ Storage/Network/Byte-level Calculation - ภาษาไทย/Unicode: CHAR_LENGTH ≠ LENGTH (1 Char = 3 Bytes ใน UTF-8)
- WHERE CHAR_LENGTH = N → Full Scan → ใช้ Generated Column หากบ่อย