คู่มือการใช้ Regular Expressions (REGEXP) ของ MySQL: ไวยากรณ์, ฟังก์ชัน MySQL 8, ตัวอย่าง, และแนวปฏิบัติที่ดีที่สุด

目次

1. บทนำ

การใช้ Regular Expressions ใน MySQL

MySQL เป็นระบบจัดการฐานข้อมูลที่มีประสิทธิภาพสำหรับการค้นหาและการจัดการข้อมูล และยังรองรับ regular expressions (REGEXP) เพื่อให้การค้นหามีความยืดหยุ่นมากขึ้น ด้วย regular expressions คุณสามารถสกัดข้อมูลที่ตรงกับรูปแบบเฉพาะได้อย่างมีประสิทธิภาพ รวมถึงการจัดรูปแบบหรือการตรวจสอบความถูกต้องของข้อมูล.

ประโยชน์ของการใช้ Regular Expressions ใน MySQL

การใช้ regular expressions ของ MySQL มีประโยชน์ดังต่อไปนี้:

  • การค้นหาขั้นสูง : สกัดข้อมูลที่มีสตริงหรือรูปแบบเฉพาะได้อย่างง่ายดาย.
  • ตรวจสอบความสมบูรณ์ของข้อมูล : มีประโยชน์สำหรับการตรวจสอบข้อมูลเข้า (เช่น การตรวจสอบรูปแบบที่อยู่อีเมล).
  • มีความสามารถมากกว่าโอเปอเรเตอร์ LIKE : เมื่อเทียบกับ LIKE ที่ใช้ไวลด์การ์ด ( % และ _ ) REGEXP ช่วยให้คุณกำหนดเงื่อนไขการค้นหาที่ซับซ้อนได้อย่างยืดหยุ่นมากขึ้น.

จุดประสงค์และโครงสร้างของบทความนี้

บทความนี้อธิบายทุกอย่างตั้งแต่พื้นฐานของ regular expressions ใน MySQL ไปจนถึงการใช้งานขั้นสูง การปรับประสิทธิภาพ และฟังก์ชัน regular expression ใหม่ที่แนะนำใน MySQL 8.0 ขึ้นไป ด้วยตัวอย่างที่เป็นประโยชน์ เนื้อหาถูกออกแบบให้เข้าใจง่ายแม้สำหรับผู้เริ่มต้น.

โครงสร้างบทความ:

  1. พื้นฐานและไวยากรณ์ของ regular expression ใน MySQL
  2. ฟังก์ชัน regular expression ที่เพิ่มใน MySQL 8.0 ขึ้นไป
  3. ตัวอย่างการใช้งาน (การตรวจสอบ, การสกัดข้อมูล, การแปลงรูปแบบ)
  4. ข้อควรพิจารณาที่สำคัญเมื่อใช้ regular expression (ประสิทธิภาพ, ความปลอดภัย)
  5. FAQ (คำถามที่พบบ่อย)
  6. สรุป

2. พื้นฐานและไวยากรณ์ของ Regular Expression ใน MySQL

วิธีการใช้ Regular Expressions ใน MySQL

ใน MySQL คุณใช้โอเปอเรเตอร์ REGEXP (หรือ RLIKE) เพื่อทำงานกับ regular expressions. คล้ายกับโอเปอเรเตอร์ LIKE มันใช้เพื่อตรวจสอบว่าค่าของคอลัมน์ตรงกับรูปแบบ regex ที่กำหนดหรือไม่.

ไวยากรณ์พื้นฐาน

SELECT * FROM table_name WHERE column_name REGEXP 'regex_pattern';

Or

SELECT * FROM table_name WHERE column_name RLIKE 'regex_pattern';

RLIKE เป็นนามแฝงของ REGEXP และทั้งสองทำงานเช่นเดียวกัน.

ตัวอย่าง
เช่น การค้นหารายการที่ชื่อมีอักขระ “山”:

SELECT * FROM users WHERE name REGEXP '山';

รูปแบบ Regular Expression พื้นฐาน

ใน regular expressions ของ MySQL คุณสามารถใช้รูปแบบต่าง ๆ ดังต่อไปนี้.

SymbolMeaningExampleResult
.Any single charactera.cMatches “abc”, “aac”, “adc”
^Start of the string^abcMatches “abcde” but not “dabc”
$End of the stringxyz$Matches “axyz” but not “xyzb”
[]Any one of the specified characters[abc]Matches “a”, “b”, or “c”
[^]Any character not in the specified set[^abc]Matches any character except “a”, “b”, or “c”
*Repeat the preceding character 0 or more timesa*Matches “”, “a”, “aa”, “aaa”, etc.
+Repeat the preceding character 1 or more timesa+Matches “a”, “aa”, “aaa”, etc. (does not match the empty string)
{n}Repeat the preceding character exactly n timesa{3}Matches “aaa”
{n,}Repeat the preceding character at least n timesa{2,}Matches “aa”, “aaa”, “aaaa”, etc.
{n,m}Repeat the preceding character between n and m timesa{2,4}Matches “aa”, “aaa”, “aaaa”

ความแตกต่างจากโอเปอเรเตอร์ LIKE

MySQL ยังมีโอเปอเรเตอร์ LIKE ซึ่งมักใช้สำหรับการจับคู่รูปแบบอย่างง่าย อย่างไรก็ตาม REGEXP มีความสามารถมากกว่า LIKE และรองรับการค้นหาด้วยเงื่อนไขที่ซับซ้อนมากขึ้น.

ตัวอย่างที่ 1: การใช้โอเปอเรเตอร์ LIKE

SELECT * FROM users WHERE name LIKE '%山%';
  • ด้วย LIKE คุณสามารถค้นหาข้อมูลที่มี ได้ แต่คุณสามารถใช้ไวลด์การ์ดอย่างง่าย ( % และ _ ) เท่านั้น.

ตัวอย่างที่ 2: การใช้โอเปอเรเตอร์ REGEXP

SELECT * FROM users WHERE name REGEXP '^山';
  • ด้วย REGEXP คุณสามารถสกัดข้อมูลที่ชื่อ เริ่มต้นด้วย 山 เท่านั้น.

วิธีการระบุหลายรูปแบบ

คุณสามารถใช้ | เพื่อระบุหลายรูปแบบด้วยเงื่อนไข OR.

ตัวอย่าง: ดึงผู้ใช้ที่นามสกุลเป็น “佐藤” หรือ “田中”

SELECT * FROM users WHERE name REGEXP '佐藤|田中';

การจับคู่แบบลบ

หากคุณใช้ ^ ภายในวงเล็บเหลี่ยม คุณสามารถดึงข้อมูลที่ “ไม่ประกอบด้วยอักขระที่ระบุ”.

ตัวอย่าง: ข้อมูลที่เริ่มต้นด้วยอักขระที่ไม่ใช่ “山”

SELECT * FROM users WHERE name REGEXP '^[^山]';

ในกรณีนี้ จะคืนรายการที่ชื่อไม่เริ่มต้นด้วย .

สรุป

  • ใน MySQL, REGEXP ช่วยให้สามารถค้นหาแพทเทิร์นที่ทรงพลังกว่าการใช้ LIKE ได้
  • การเข้าใจไวยากรณ์พื้นฐานและแพทเทิร์น ( . , ^ , $ , [] , * , + , ฯลฯ) ช่วยให้สามารถค้นหาได้อย่างยืดหยุ่น
  • สำคัญที่จะต้องเข้าใจความแตกต่างจาก LIKE และใช้แต่ละอย่างให้เหมาะสม
  • การใช้ | ช่วยให้สามารถค้นหาด้วยแพทเทิร์นหลายตัวได้
  • การใช้ชั้นอักขระเชิงลบ [^ ] ช่วยให้ค้นหาข้อมูลที่ไม่เริ่มต้นด้วยอักขระเฉพาะได้

3. ฟังก์ชัน Regular Expression ที่เพิ่มเข้ามาใน MySQL 8.0 และเวอร์ชันถัดไป

ใน MySQL 8.0 นอกจากตัวดำเนินการ REGEXP แบบดั้งเดิมแล้ว ยังได้เพิ่ม ฟังก์ชันใหม่สี่ตัว เพื่อให้สามารถค้นหาด้วย regular expression ได้ยืดหยุ่นมากขึ้น สิ่งเหล่านี้ทำให้สามารถดึงตำแหน่งที่ตรงกัน สกัด substring และทำการแทนที่ได้ ขยายสิ่งที่คุณสามารถทำกับ regex ใน MySQL ได้อย่างมาก

ในส่วนนี้ เราจะอธิบายแต่ละ ฟังก์ชัน regular expression ใหม่ อย่างละเอียดและแสดงตัวอย่างที่เป็นรูปธรรม

3.1 REGEXP_LIKE()

ภาพรวม

REGEXP_LIKE() เช่นเดียวกับตัวดำเนินการ REGEXP ตรวจสอบว่าค่าคอลัมน์ ตรงกับแพทเทิร์น regex ที่ระบุ หรือไม่

ไวยากรณ์

REGEXP_LIKE(column_name, 'regex_pattern' [, flags])
  • column_name : คอลัมน์ที่จะค้นหา
  • 'regex_pattern' : แพทเทิร์น regex ที่ใช้เป็นเงื่อนไข
  • flags (optional) : การไวต่อตัวพิมพ์ใหญ่-เล็ก (ใช้ i สำหรับการจับคู่ที่ไม่ไวต่อตัวพิมพ์)

ตัวอย่าง

“รับผู้ใช้ที่มีอีเมลสิ้นสุดด้วย gmail.com หรือ yahoo.co.jp

SELECT * FROM users WHERE REGEXP_LIKE(email, '(@gmail\.com|@yahoo\.co\.jp)$');

“ค้นหาชื่อผู้ใช้ที่ประกอบด้วย ‘admin’ (ไม่ไวต่อตัวพิมพ์)”

SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');

REGEXP_LIKE() มีวัตถุประสงค์เดียวกับตัวดำเนินการ REGEXP แต่ช่วยให้สไตล์ที่เป็นมิตรกับ standard-SQL มากกว่า

3.2 REGEXP_INSTR()

ภาพรวม

REGEXP_INSTR() คืนค่า ตำแหน่ง (ดัชนีเริ่มต้น) ที่เกิดการจับคู่ regex ภายในสตริง

ไวยากรณ์

REGEXP_INSTR(column_name, 'regex_pattern' [, start_position, occurrence, return_option, flags])
  • start_position (optional): ที่จะเริ่มค้นหา (ค่าเริ่มต้น: 1)
  • occurrence (optional): การเกิดการจับคู่นั้นที่สี่ที่จะคืนค่า (ค่าเริ่มต้น: 1)
  • return_option (optional): 0 (คืนค่าตำแหน่งเริ่มต้น) หรือ 1 (คืนค่าตำแหน่งสิ้นสุดของการจับคู่)
  • flags (optional): ใช้ i สำหรับการจับคู่ที่ไม่ไวต่อตัวพิมพ์

ตัวอย่าง

“หากหมายเลขโทรศัพท์เริ่มต้นด้วย 090 หรือ 080 ให้รับตำแหน่งเริ่มต้น”

SELECT phone, REGEXP_INSTR(phone, '^(090|080)') AS match_pos FROM users;

“รับตำแหน่งเริ่มต้นของส่วนโดเมนในที่อยู่อีเมล”

SELECT email, REGEXP_INSTR(email, '@') AS domain_start FROM users;
  • มันคืนค่าตำแหน่งที่พบ @ (เช่น user@example.com คืนค่า 5 )

✅ ด้วย REGEXP_INSTR() คุณสามารถดึง ข้อมูลตำแหน่ง ได้ ขยายตัวเลือกสำหรับการประมวลผลสตริง

3.3 REGEXP_SUBSTR()

ภาพรวม

REGEXP_SUBSTR() สกัด substring ที่ตรงกับแพทเทิร์น regex จากภายในสตริง

ไวยากรณ์

REGEXP_SUBSTR(column_name, 'regex_pattern' [, start_position, occurrence, flags])
  • occurrence (optional): รับการจับคู่นที่ n (ค่าเริ่มต้น: 1)
  • flags (optional): การไวต่อตัวพิมพ์ ( i เพื่อละเว้นตัวพิมพ์)

ตัวอย่าง

“สกัดเฉพาะส่วนโดเมนจากที่อยู่อีเมล”

SELECT email, REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') AS domain FROM users;

“รับลำดับตัวเลขแรกในข้อความ”

SELECT message, REGEXP_SUBSTR(message, '[0-9]+') AS first_number FROM logs;

✅ ด้วย REGEXP_SUBSTR() คุณสามารถสกัดแพทเทิร์นเฉพาะและใช้สำหรับการจัดระเบียบและแปลงข้อมูล

3.4 REGEXP_REPLACE()

ภาพรวม

REGEXP_REPLACE() แทนที่ substring ที่ตรงกับแพทเทิร์น regex ด้วยสตริงอื่น

ไวยากรณ์

REGEXP_REPLACE(column_name, 'regex_pattern', 'replacement' [, occurrence, flags])
  • replacement : สตริงที่ใช้แทนส่วนที่ตรงกัน
  • occurrence (optional): แทนที่เฉพาะการจับคู่ที่ n‑th (หากละเว้น จะทำการแทนที่ทั้งหมด)
  • flags (optional): ใช้ i สำหรับการจับคู่โดยไม่สนใจตัวพิมพ์ใหญ่‑เล็ก

ตัวอย่าง

“ลบเครื่องหมายขีด (-) จากหมายเลขโทรศัพท์”

SELECT phone, REGEXP_REPLACE(phone, '-', '') AS clean_phone FROM users;

“ลบแท็ก HTML”

SELECT comment, REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_text FROM reviews;

✅ ด้วย REGEXP_REPLACE() , การแปลงรูปแบบและการทำความสะอาดข้อมูลกลายเป็นเรื่องง่าย.

3.5 สรุป

FunctionPurposeExample
REGEXP_LIKE()Check whether a value matches a regex patternSELECT * FROM users WHERE REGEXP_LIKE(email, '@gmail\.com$');
REGEXP_INSTR()Get the start position of the matched substringSELECT REGEXP_INSTR(email, '@') FROM users;
REGEXP_SUBSTR()Extract the matched substringSELECT REGEXP_SUBSTR(email, '@[a-zA-Z0-9.-]+') FROM users;
REGEXP_REPLACE()Replace the matched substringSELECT REGEXP_REPLACE(phone, '-', '') FROM users;

4. ตัวอย่างการใช้งานจริงของ Regular Expressions ใน MySQL

โดยการใช้ Regular Expressions ของ MySQL คุณสามารถทำให้กระบวนการประมวลผลข้อมูลในโลกจริงเป็นไปอย่างราบรื่น เช่น การตรวจสอบความถูกต้องของข้อมูล, การสกัดข้อมูลเฉพาะ, และ การแปลงรูปแบบ ในส่วนนี้เราจะนำเสนอกรณีการใช้งานจริงพร้อมโค้ด SQL และคำอธิบาย.

4.1 การตรวจสอบความถูกต้องของที่อยู่อีเมล

ภาพรวม

ใช้ Regular Expressions เพื่อตรวจสอบว่าที่อยู่อีเมลที่เก็บในฐานข้อมูลมีรูปแบบที่ถูกต้องหรือไม่.

SQL ที่ใช้

SELECT email FROM users 
WHERE email REGEXP '^[a-zA-Z0-9._%+-]+@[a-zA-Z0-9.-]+\.[a-zA-Z]{2,}$';

คำอธิบาย

  • ^[a-zA-Z0-9._%+-]+ → ตัวอักษรหรือตัวเลขหนึ่งตัวหรือมากกว่า, จุด, ขีดล่าง หรือเครื่องหมายบวก ก่อน @
  • @[a-zA-Z0-9.-]+ → ชื่อโดเมนหลัง @
  • \.[a-zA-Z]{2,}$ → สิ้นสุดด้วย TLD (Top‑Level Domain) อย่างน้อย 2 ตัวอักษร (เช่น .com , .jp , .net )

ด้วยคิวรีนี้คุณสามารถ กรองอีเมลที่ไม่ถูกต้อง (เช่น user@@example.com, user@.com).

4.2 ตรวจสอบรูปแบบหมายเลขโทรศัพท์ญี่ปุ่น

ภาพรวม

ตรวจสอบว่าหมายเลขโทรศัพท์ญี่ปุ่นทั่วไป (เช่น 090-1234-5678, 03-1234-5678) มีรูปแบบที่ถูกต้องหรือไม่.

SQL ที่ใช้

SELECT phone FROM users 
WHERE phone REGEXP '^(0[789]0-[0-9]{4}-[0-9]{4}|0[1-9]-[0-9]{4}-[0-9]{4})$';

คำอธิบาย

  • 0[789]0-[0-9]{4}-[0-9]{4} → หมายเลขมือถือ ( 090-xxxx-xxxx , 080-xxxx-xxxx ฯลฯ)
  • 0[1-9]-[0-9]{4}-[0-9]{4} → หมายเลขพื้นฐาน ( 03-xxxx-xxxx , 06-xxxx-xxxx ฯลฯ)

ด้วยวิธีนี้ Regular Expressions มีประโยชน์เมื่อ ต้องการความสอดคล้องของรูปแบบ.

4.3 การตรวจสอบรูปแบบหมายเลขบัตรเครดิต

ภาพรวม

ตรวจสอบรูปแบบของหมายเลขบัตรเครดิต (Visa, Mastercard, American Express ฯลฯ).

SQL ที่ใช้

SELECT card_number FROM payments 
WHERE card_number REGEXP '^(4[0-9]{12}(?:[0-9]{3})?|5[1-5][0-9]{14}|3[47][0-9]{13})$';

คำอธิบาย

  • ^4[0-9]{12}(?:[0-9]{3})?$ → Visa (16 หลักหรือ 13 หลัก)
  • ^5[1-5][0-9]{14}$ → Mastercard (16 หลัก)
  • ^3[47][0-9]{13}$ → American Express (15 หลัก)

ด้วยคิวรีนี้คุณสามารถ กรองหมายเลขบัตรที่ไม่ถูกต้อง ในฐานข้อมูล (เช่น ความยาวไม่ตรงหรือเลขเริ่มต้นไม่ถูกต้อง).

4.4 การลบแท็ก HTML

ภาพรวม

หากข้อมูลที่ผู้ใช้ส่งเข้ามามีแท็ก HTML คุณสามารถลบแท็กเหล่านั้นและ แปลงเนื้อหาเป็นข้อความธรรมดา.

SQL ที่ใช้

SELECT REGEXP_REPLACE(comment, '<[^>]+>', '') AS clean_comment FROM reviews;

คำอธิบาย

  • '<[^>]+>' → ลบแท็ก HTML ทั้งหมดที่อยู่ระหว่าง < และ >

ตัวอย่าง

InputOutput
<b>Hello</b> World!Hello World!
<p>これはサンプルです</p>これはサンプルです

สิ่งนี้มีประโยชน์สำหรับ การลบแท็ก HTML จากคอมเมนต์ของผู้ใช้และบล็อกโพสต์.

4.5 การตรวจสอบรูปแบบรหัสไปรษณีย์ (ญี่ปุ่น)

ภาพรวม

ตรวจสอบว่ารหัสไปรษณีย์ญี่ปุ่น (เช่น 123-4567) มีรูปแบบที่ถูกต้องหรือไม่.

SQL ที่ใช้

SELECT postal_code FROM addresses 
WHERE postal_code REGEXP '^[0-9]{3}-[0-9]{4}$';

คำอธิบาย

  • ^[0-9]{3}-[0-9]{4}$ → รหัสไปรษณีย์ในรูปแบบ “3 ตัวเลข-4 ตัวเลข”

การใช้ regex นี้ช่วย รักษาความสอดคล้องของข้อมูลและป้องกันรูปแบบที่ไม่ถูกต้อง.

4.6 การกรองชื่อผู้ใช้ (ตรวจจับคำที่ห้ามใช้)

ภาพรวม

ใช้ Regular Expressions เพื่อตรวจจับและกรองคำที่ไม่อนุญาตในชื่อผู้ใช้.

Check whether usernames contain disallowed words reserved for system use (e.g., admin, root, system) during registration.

SQL ที่ใช้

SELECT username FROM users 
WHERE username REGEXP 'admin|root|system';

คำอธิบาย

  • admin|root|system → ตรวจจับชื่อผู้ใช้ที่มีคำเหล่านี้

คิวรีนี้ช่วยป้องกันไม่ให้ผู้ใช้ทั่วไปใช้ชื่อที่ตั้งไว้สำหรับผู้ดูแลระบบ.

สรุป

  • นิพจน์ปกติ (Regular expressions) สามารถใช้สำหรับ การตรวจสอบที่อยู่อีเมล, หมายเลขโทรศัพท์, และหมายเลขบัตรเครดิต .
  • พวกมันยังสามารถนำไปใช้ในการ ลบแท็ก HTML และแปลงรูปแบบข้อมูล .
  • พวกมันมีประสิทธิภาพในการปรับปรุงความปลอดภัยและความสอดคล้องของฐานข้อมูลผ่านงานเช่น การกรองคำที่ไม่ได้รับอนุญาตและการตรวจสอบรหัสไปรษณีย์ .

5. ข้อควรพิจารณาที่สำคัญเมื่อใช้ Regular Expressions (ประสิทธิภาพและความปลอดภัย)

การใช้ regular expressions ใน MySQL ทำให้สามารถค้นหาและทำความสะอาดข้อมูลได้อย่างมีประสิทธิภาพ อย่างไรก็ตาม, การใช้งานที่ไม่เหมาะสมอาจทำให้ประสิทธิภาพลดลงและก่อให้เกิดความเสี่ยงด้านความปลอดภัย ส่วนนี้อธิบายข้อควรพิจารณาหลักสำหรับการใช้ regular expressions ของ MySQL อย่างปลอดภัยและมีประสิทธิภาพ

5.1 การเพิ่มประสิทธิภาพการทำงานสำหรับ Regular Expressions

การค้นหา regex ใน MySQL นั้นสะดวก แต่มีข้อเสีย: โดยทั่วไปดัชนีจะไม่ทำงาน ซึ่งอาจทำให้คิวรีช้าลง.

มาตรการเพื่อปรับปรุงประสิทธิภาพ

  1. รวมดัชนี LIKE หรือ FULLTEXT
    SELECT * FROM users WHERE email LIKE '%gmail.com';
    
  1. ใช้ regular expressions ที่ง่ายกว่า
    SELECT * FROM users WHERE name REGEXP '^admin|admin$';
    
  1. กรองข้อมูลเป้าหมายก่อน
    SELECT * FROM users WHERE email LIKE 'a%' AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
    

5.2 ความเสี่ยงด้านความปลอดภัยและมาตรการป้องกัน

1. Regular Expression DoS (ReDoS)

  • หลีกเลี่ยงการจับคู่ที่ไม่มีขอบเขตเช่น .* .
  • ใช้ ^ และ $ เพื่อจำกัดขอบเขตการค้นหา.
  • อย่าใส่ข้อมูลผู้ใช้โดยตรงลงใน REGEXP .

2. SQL Injection และ Regular Expressions

คิวรีที่ไม่ปลอดภัย

SELECT * FROM users WHERE username REGEXP '$input';

คิวรีที่ปลอดภัย (ใช้ placeholders)

$stmt = $pdo->prepare("SELECT * FROM users WHERE username REGEXP ?");
$stmt->execute([$sanitized_input]);

5.3 ความเข้ากันได้ของเวอร์ชัน

VersionMain Features
MySQL 5.xOnly the REGEXP operator is available
MySQL 8.xAdds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE()

สรุป

  • เนื่องจาก REGEXP ไม่ใช้ดัชนี การวัดประสิทธิภาพจึงสำคัญ.
  • เพื่อป้องกัน ReDoS (Regular Expression DoS) ควรหลีกเลี่ยงการใช้ไวลด์การ์ดมากเกินไป.
  • เพื่อป้องกัน SQL injection อย่าใช้ข้อมูลผู้ใช้โดยตรงกับ REGEXP.

6. คำถามที่พบบ่อย (FAQ)

นี่คือคำถามทั่วไปเกี่ยวกับการใช้ regular expressions ของ MySQL (REGEXP) การแก้ไขปัญหาเหล่านี้จะช่วยให้คุณใช้ regex ได้อย่างมีประสิทธิภาพมากขึ้น.


6.1 ฉันสามารถใช้รูปแบบ regex ใดใน MySQL?

SymbolDescriptionExampleResult
.Any single charactera.c"abc", "aac", "adc"
^Start of the string^abc"abcde" (does not match "dabc")
$End of the stringxyz$"axyz" (does not match "xyzb")
[]Any of the specified characters[abc]"a", "b", "c"
[^]Any character not in the specified set[^abc]Any character except "a", "b", "c"
*Repeat the preceding character 0 or more timesa*"", "a", "aa", "aaa"
+Repeat the preceding character 1 or more timesa+"a", "aa", "aaa" (does not match "")

6.2 ความแตกต่างระหว่าง LIKE และ REGEXP คืออะไร?

ComparisonLIKEREGEXP
FunctionalitySimple pattern matchingSearching with complex regular expressions
Wildcards% (any string), _ (any single character).* (any string), ^, $, [a-z], etc.
Search speedFast because indexes can applyOften slower due to full table scans
Use casesSimple searches (contains, prefix matching, etc.)Complex searches based on specific patterns

เนื่องจาก LIKE เร็วกว่า ควรใช้ LIKE สำหรับการค้นหาง่าย ๆ และใช้ REGEXP เมื่อจำเป็นต้องจับคู่ที่ซับซ้อน.

6.3 ความแตกต่างของคุณสมบัติ regex ระหว่าง MySQL 5.x และ MySQL 8.x คืออะไร?

VersionMain Features
MySQL 5.xOnly the REGEXP operator is available
MySQL 8.xAdds REGEXP_LIKE(), REGEXP_INSTR(), REGEXP_SUBSTR(), and REGEXP_REPLACE()

6.4 ควรทำอย่างไรหาก regex ไม่ทำงานตามที่คาดหวัง?

รายการตรวจสอบ

  1. ตรวจสอบว่าการ escape ถูกต้องหรือไม่
    SELECT * FROM users WHERE email REGEXP '\.com$';
    
  1. ลองใช้ flag i กับ REGEXP_LIKE()
    SELECT * FROM users WHERE REGEXP_LIKE(username, 'admin', 'i');
    
  1. ตรวจสอบการเข้ารหัสข้อมูล
    SHOW VARIABLES LIKE 'character_set_database';
    

6.5 ฉันจะปรับปรุงประสิทธิภาพของคิวรี REGEXP อย่างไร?

  1. กรองล่วงหน้าด้วย LIKE
    SELECT * FROM users 
    WHERE email LIKE '%gmail.com' 
    AND email REGEXP '^[a-zA-Z0-9._%+-]+@gmail\.com$';
    
  1. ใช้ดัชนีเมื่อเหมาะสม
    ALTER TABLE users ADD FULLTEXT(email);
    

สรุป

  • REGEXP มีพลังมากกว่า LIKE , แต่คุณต้องระมัดระวังเรื่องประสิทธิภาพ.
  • ใน MySQL 8.0, ฟังก์ชัน regex ใหม่ (เช่น REGEXP_LIKE()) ถูกเพิ่มเข้ามา ทำให้การประมวลผลยืดหยุ่นมากขึ้น.
  • เพื่อปรับปรุงประสิทธิภาพ: ผสานกับ LIKE, ใช้ดัชนี, และออกแบบแพทเทิร์น regex ที่ง่าย

7. สรุป

Regular expressions ของ MySQL (REGEXP) มีประโยชน์อย่างมากสำหรับการค้นหาข้อมูล, การตรวจสอบความถูกต้อง, และการแปลงรูปแบบ. บทความนี้ครอบคลุมพื้นฐาน regex ของ MySQL, ฟีเจอร์ใหม่ที่เพิ่มใน MySQL 8.0 และต่อมา, ตัวอย่างการใช้งาน, ข้อควรพิจารณาที่สำคัญ, และคำถามที่พบบ่อย.

7.1 สิ่งที่ควรจำ

นี่คือสรุปสั้น ๆ ของประเด็นสำคัญที่สุด.

1. พื้นฐาน Regular Expression ของ MySQL

  • การใช้ ตัวดำเนินการ REGEXP ทำให้ การจับคู่แพทเทิร์นที่ยืดหยุ่นมากขึ้น เมื่อเทียบกับ LIKE .
  • แพทเทิร์น regex ที่พบบ่อย
  • ^ (จุดเริ่มต้น), $ (จุดสิ้นสุด), . (อักขระใด ๆ หนึ่งตัว), [] (คลาสอักขระ), + (หนึ่งหรือหลายครั้ง), เป็นต้น

2. ฟังก์ชัน Regular Expression ใหม่ใน MySQL 8.0+

ใน MySQL 8.0, ฟังก์ชันสี่ตัวนี้ถูกเพิ่มเข้ามา ทำให้การประมวลผลยืดหยุ่นมากขึ้น:

  • REGEXP_LIKE() : ทางเลือกของตัวดำเนินการ REGEXP
  • REGEXP_INSTR() : รับตำแหน่งเริ่มต้นของสตริงย่อยที่ตรงกัน
  • REGEXP_SUBSTR() : ดึงสตริงย่อยที่ตรงกัน
  • REGEXP_REPLACE() : แทนที่สตริงย่อยโดยใช้ regex

3. ตัวอย่างการใช้งานจริง

  • การตรวจสอบที่อยู่อีเมล
  • การตรวจสอบหมายเลขโทรศัพท์และหมายเลขบัตรเครดิต
  • การลบแท็ก HTML
  • การตรวจสอบรูปแบบรหัสไปรษณีย์
  • การตรวจจับคำที่ห้ามใช้
  • ทำความสะอาดข้อมูล (ตัดช่องว่าง, ลบเครื่องหมายจุลภาค, เป็นต้น)

4. ข้อควรพิจารณาที่สำคัญเมื่อใช้ Regular Expressions

  • การเพิ่มประสิทธิภาพ
  • เนื่องจาก REGEXP ไม่ใช้ดัชนี, จึงอาจทำให้เกิด การสแกนตารางเต็ม .
  • คุณสามารถปรับปรุงประสิทธิภาพโดยผสานดัชนี LIKE หรือ FULLTEXT.
  • มาตรการด้านความปลอดภัย
  • เพื่อป้องกัน ReDoS (Regular Expression DoS), หลีกเลี่ยงการใช้ .* มากเกินไป.
  • เพื่อป้องกัน SQL injection, ใช้ placeholders .

5. คำถามที่พบบ่อย (FAQ)

  • แพทเทิร์น Regex ที่มีใน MySQL
  • ความแตกต่างระหว่าง LIKE กับ REGEXP
  • ความแตกต่างของฟีเจอร์ระหว่าง MySQL 5.x กับ 8.x
  • การแก้ไขปัญหาเมื่อ regex ไม่ทำงานตามที่คาดหวัง
  • วิธีการปรับปรุงประสิทธิภาพ

7.2 แนวทางปฏิบัติที่ดีที่สุดสำหรับการใช้ Regular Expressions

  1. ทำให้แพทเทิร์น regex ง่าย
  • ตัวอย่าง: หลีกเลี่ยงการใช้ .* มากเกินไปและใช้ ^ (จุดเริ่มต้น) และ $ (จุดสิ้นสุด) ให้เต็มที่.
  1. ผสานกับ LIKE หรือ FULLTEXT เมื่อเหมาะสม
  • กรองล่วงหน้าด้วย LIKE แล้วจึงใช้ REGEXP เพื่อลดค่าใช้จ่ายของคิวรี.
  1. ใช้ REGEXP_REPLACE() สำหรับทำความสะอาดข้อมูล
  • ตัวอย่าง: ลบแท็ก HTML และทำให้ช่องว่างที่ไม่จำเป็นเป็นมาตรฐาน.
  1. ใช้ประโยชน์จาก MySQL 8.0 และรุ่นต่อไป
  • การใช้ฟังก์ชันใหม่เช่น REGEXP_LIKE() สามารถทำให้ SQL อ่านง่ายขึ้น.
  1. นำมาตรการด้านความปลอดภัยไปใช้อย่างเต็มที่
  • อย่าใช้ข้อมูลจากผู้ใช้โดยตรงกับ REGEXP (ป้องกัน SQL injection).
  • ใช้ placeholders สำหรับคิวรีแบบไดนามิก.

7.3 แหล่งข้อมูลสำหรับการเรียนรู้ต่อเนื่อง

ต่อไปนี้เป็นแหล่งอ้างอิงที่จะช่วยให้คุณเรียนรู้ Regular Expressions ของ MySQL อย่างลึกซึ้ง.

เอกสารอย่างเป็นทางการ

7.4 หมายเหตุสุดท้าย

Regular Expression ของ MySQL สามารถใช้ได้ในหลายสถานการณ์ รวมถึงการค้นหาข้อมูล, การทำความสะอาด, และการตรวจสอบความถูกต้อง. อย่างไรก็ตาม การใช้ให้เหมาะสมพร้อมเข้าใจข้อพิจารณาด้านประสิทธิภาพและความปลอดภัยเป็นสิ่งสำคัญ.

เราหวังว่าบทความนี้จะช่วยคุณเมื่อทำงานกับ Regular Expression ของ MySQL. ลองนำเทคนิคเหล่านี้ไปใช้ในโครงการของคุณ!