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

ชนิดฟิลด์สำหรับค้นหาข้อมูลใน MySQL: ใช้ REGEXP_INSTR

ฟังก์ชัน REGEXP_INSTR() (MySQL 8.0+)

คืนตำแหน่งเริ่มต้นของ pattern ที่ match (1-based) หรือ 0 ถ้าไม่พบ — ใช้ใน WHERE ได้โดยตรง

ไวยากรณ์

REGEXP_INSTR(expr, pattern, position, occurrence, return_option, match_type)

  • คืนค่า > 0 = พบ
  • คืนค่า 0 = ไม่พบ

ตัวอย่าง: ตาราง demo64

CREATE TABLE demo64 (
    id INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
    name VARCHAR(40)
);

INSERT INTO demo64 (name) VALUES
('John Smith'), ('John Doe'), ('Chris Brown'),
('David Miller'), ('Carol Taylor');

คำสั่งค้นหา 'John'

SELECT * FROM demo64
WHERE REGEXP_INSTR(name, 'John');

ผลลัพธ์

+----+------------+
| id | name       |
+----+------------+
| 1  | John Smith |
| 2  | John Doe   |
+----+------------+

เปรียบเทียบฟังก์ชันค้นหา

ฟังก์ชันคืนค่าใช้ใน WHERE ได้ไหมรองรับ Regex
LIKETRUE/FALSE✅❌ (แค่ % _)
REGEXPTRUE/FALSE✅✅
REGEXP_INSTRPosition (INT)✅✅
REGEXP_SUBSTRMatched String✅✅
LOCATE()Position (INT)✅❌ (substring ธรรมดา)
INSTR()Position (INT)✅❌

ตัวอย่าง REGEXP_INSTR 進階

1. ค้นหาตำแหน่งที่ 2 ที่พบ

SELECT REGEXP_INSTR('abc def ghi', '[a-z]+', 1, 2);  -- คืน 5 (ตำแหน่ง 'd')

2. คืนค่าตำแหน่งหลัง match (return_option = 1)

SELECT REGEXP_INSTR('abc123', '[0-9]+', 1, 1, 1);  -- คืน 7 (หลัง '123')

3. Case-sensitive

SELECT REGEXP_INSTR('John', 'john', 1, 1, 0, 'c');  -- 0 (ไม่พบ)
SELECT REGEXP_INSTR('John', 'john', 1, 1, 0, 'i');  -- 1 (พบ, case-insensitive)

ประสิทธิภาพและข้อแนะนำ

  • REGEXP_INSTR ไม่ใช้ INDEX → Full table scan
  • สำหรับค้นหา简单: ใช้ LIKE หรือ LOCATE() เร็วกว่า
  • สำหรับ Full-Text Search จริง: ใช้ FULLTEXT INDEX + MATCH() AGAINST()
  • MySQL < 8.0: ใช้ REGEXP แทน (คืน TRUE/FALSE)

ชนิดข้อมูลแนะนำสำหรับคอลัมน์ค้นหา

  • VARCHAR(255): ข้อความสั้น, ชื่อ, รหัส
  • TEXT: ข้อความยาว, รายละเอียด
  • JSON: ค้นหาใน JSON (MySQL 5.7+ มี JSON_EXTRACT, JSON_SEARCH)