การแปลงข้อมูลทุกคอลัมน์/ทุกแถวเป็นตัวพิมพ์เล็กด้วย LOWER() และ UPDATE
ใช้คำสั่ง UPDATE ร่วมกับฟังก์ชัน LOWER() บนทุกคอลัมน์ที่ต้องการแปลง ทำได้ใน Query เดียว
ตัวอย่างการใช้งาน
สร้างตารางและเพิ่มข้อมูลตัวใหญ่:
mysql> CREATE TABLE DemoTable (
-> Id VARCHAR(100),
-> StudentFirstName VARCHAR(20),
-> StudentLastName VARCHAR(20),
-> StudentCountryName VARCHAR(10)
-> );
Query OK, 0 rows affected (0.61 sec)
mysql> INSERT INTO DemoTable VALUES('STU-101','John','Smith','US'),('STU-102','John','Doe','UK'),('STU-103','David','Miller','AUS');
Query OK, 3 rows affected (0.15 sec)
ข้อมูลก่อน (ตัวใหญ่):
mysql> SELECT * FROM DemoTable;
+---------+------------------+-----------------+--------------------+
| Id | StudentFirstName | StudentLastName | StudentCountryName |
+---------+------------------+-----------------+--------------------+
| STU-101 | John | Smith | US |
| STU-102 | John | Doe | UK |
| STU-103 | David | Miller | AUS |
+---------+------------------+-----------------+--------------------+
3 rows in set (0.00 sec)
อัปเดตทุกคอลัมน์ให้เป็นตัวเล็ก:
mysql> UPDATE DemoTable
-> SET Id = LOWER(Id),
-> StudentFirstName = LOWER(StudentFirstName),
-> StudentLastName = LOWER(StudentLastName),
-> StudentCountryName = LOWER(StudentCountryName);
Query OK, 3 rows affected (0.22 sec)
Rows matched: 3 Changed: 3 Warnings: 0
ผลลัพธ์หลังแปลง:
mysql> SELECT * FROM DemoTable;
+---------+------------------+-----------------+--------------------+
| Id | StudentFirstName | StudentLastName | StudentCountryName |
+---------+------------------+-----------------+--------------------+
| stu-101 | john | smith | us |
| stu-102 | john | doe | uk |
| stu-103 | david | miller | aus |
+---------+------------------+-----------------+--------------------+
3 rows in set (0.00 sec)
คำอธิบาย
LOWER(str)แปลงตัวอักษร A-Z → a-z (รองรับ Unicode ตาม Collation)- คู่คือ
UPPER(str)แปลงเป็นตัวใหญ่ - UPDATE ทุกคอลัมน์ใน Statement เดียว → Atomic, เร็วกว่า Update หลายรอบ
ข้อควรระวัง
- การ UPDATE ทุกแถว (ไม่มี WHERE) จะ Lock ตารางทั้งหมด ตารางใหญ่ควรแบ่ง Batch (WHERE Id BETWEEN ...)
- Index บนคอลัมน์ที่ UPDATE จะต้อง Rebuild (ช้า)
- Collation Case-insensitive (ci) การค้นหา 'JOHN' = 'john' ยังทำงานได้ แต่การ Sort จะต่างไป
- Backup ก่อนรัน Production!
ประยุกต์: แปลงเฉพาะบางแถว
UPDATE DemoTable
SET StudentFirstName = LOWER(StudentFirstName)
WHERE StudentFirstName REGEXP BINARY '[A-Z]'; -- แปลงเฉพาะที่มีตัวใหญ่