Computer >> Hướng Dẫn Máy Tính >  >> Lập Trình >> MySQL

MySQL tự động chuyển chữ thường khi INSERT? Trigger BEFORE INSERT?

Giải pháp: Trigger BEFORE INSERT

Tạo trigger tự động áp dụng LOWER() trước khi INSERT.

Ví dụ minh họa

Tạo bảng

mysql> CREATE TABLE DemoTable (
    StudentSubject TEXT
);

Tạo Trigger

mysql> CREATE TRIGGER lowerCaseOnInsertDemo 
    -> BEFORE INSERT ON DemoTable 
    -> FOR EACH ROW 
    -> SET NEW.StudentSubject = LOWER(NEW.StudentSubject);

Chèn dữ liệu

mysql> INSERT INTO DemoTable VALUES('MOngoDb');
mysql> INSERT INTO DemoTable VALUES('JaVA');
mysql> INSERT INTO DemoTable VALUES('MySqL');

Kết quả: Tự động lowercase

mysql> SELECT * FROM DemoTable;
+----------------+
| StudentSubject |
+----------------+
| mongodb        |
| java           |
| mysql          |
+----------------+

Giải thích Trigger

  • BEFORE INSERT: Chạy trước khi dòng được ghi
  • FOR EACH ROW: Chạy cho mỗi dòng INSERT
  • NEW.column: Truy cập giá trị mới (có thể gán lại)
  • LOWER(): Hàm chuyển chữ thường

Mở rộng: Trigger cho UPDATE

CREATE TRIGGER lowerCaseOnUpdateDemo 
BEFORE UPDATE ON DemoTable 
FOR EACH ROW 
SET NEW.StudentSubject = LOWER(NEW.StudentSubject);

Kết hợp INSERT + UPDATE

CREATE TRIGGER lowerCaseOnInsertUpdate 
BEFORE INSERT ON DemoTable 
FOR EACH ROW 
SET NEW.StudentSubject = LOWER(NEW.StudentSubject);

CREATE TRIGGER lowerCaseOnUpdate 
BEFORE UPDATE ON DemoTable 
FOR EACH ROW 
SET NEW.StudentSubject = LOWER(NEW.StudentSubject);

Xem và xóa Trigger

SHOW TRIGGERS;
DROP TRIGGER IF EXISTS lowerCaseOnInsertDemo;

⚠️ Cân nhắc

Ưu điểmNhược điểm
Tự động, không phụ thuộc appLogic ẩn, khó debug
Đảm bảo tính nhất quánHiệu năng chút (trigger overhead)
Áp dụng cho mọi clientKhó migration (trigger không dump mặc định)

Thay thế tốt hơn: Application Layer

Xử lý lowercase ở application (PHP, Python, Node.js) trước khi INSERT:

-- PHP
$subject = strtolower($input_subject);
$stmt->bind_param('s', $subject);

→ Rõ ràng, testable, portable, không phụ thuộc DB engine.