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

ค้นหาข้อความที่มีความยาวเฉพาะใน MySQL ด้วย CHAR_LENGTH และ LENGTH

เมื่อต้องการ Query แถวที่ความยาวข้อความเท่ากับค่าที่กำหนด ใช้ CHAR_LENGTH() (นับตัวอักษร) หรือ LENGTH() (นับ Byte)

ความแตกต่าง CHAR_LENGTH vs LENGTH

ฟังก์ชันนับตัวอักษร ASCIIตัวอักษรไทย/Unicode
CHAR_LENGTH(str) / CHARACTER_LENGTH(str)จำนวน Character (Code Points)1 Char = 11 Char = 1 (แม้ใช้ 3 Bytes)
LENGTH(str) / OCTET_LENGTH(str)จำนวน Byte1 Char = 1 Byte1 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 หากบ่อย