Phân loại dữ liệu: Chuỗi ký tự vs Số nguyên bằng REGEXP
Sử dụng biểu thức chính quy REGEXP (hoặc RLIKE) để kiểm tra cột VARCHAR/TEXT có chứa chỉ số, chỉ chữ, hay hỗn hợp.
Cú pháp cơ bản
- Chỉ số (digits only):
col REGEXP '^[0-9]+$' - Chỉ chữ/ký tự không phải số:
col NOT REGEXP '^[0-9]+$'
1. Tạo bảng và chèn dữ liệu hỗn hợp
mysql> CREATE TABLE DemoTable (Id VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES ('1000'), ('John'), ('Carol_Smith'), ('2000');
2. Xem dữ liệu
mysql> SELECT * FROM DemoTable;
+-------------+ | Id | +-------------+ | 1000 | | John | | Carol_Smith | | 2000 | +-------------+
3. TRƯỜNG HỢP 1: Chỉ lấy giá trị KHÔNG phải số (chuỗi có chữ)
mysql> SELECT * FROM DemoTable WHERE Id NOT REGEXP '^[0-9]+$';
+-------------+ | Id | +-------------+ | John | | Carol_Smith | +-------------+
4. TRƯỜNG HỢP 2: Chỉ lấy giá trị LÀ số (chỉ chứa 0-9)
mysql> SELECT * FROM DemoTable WHERE Id REGEXP '^[0-9]+$';
+------+ | Id | +------+ | 1000 | | 2000 | +------+
Giải thích REGEXP:
^: Bắt đầu chuỗi[0-9]: Bất kỳ chữ số nào+: Một hoặc nhiều lần$: Kết thúc chuỗi^[0-9]+$: Toàn bộ chuỗi chỉ chứa 1 hoặc nhiều chữ số
Mở rộng - Các mẫu REGEXP hữu ích:
| Mẫu | Ý nghĩa |
|---|---|
'^[0-9]+$' | Chỉ số nguyên dương |
'^-?[0-9]+$' | Số nguyên (có thể âm) |
'^[0-9]*\\.?[0-9]+$' | Số thực (có dấu chấm) |
'^[A-Za-z]+$' | Chỉ chữ cái |
'^[A-Za-z0-9_]+$' | Chữ, số, gạch dưới (identifier) |
Lưu ý: REGEXP không dùng index → chậm trên bảng lớn. Cân nhắc thêm cột flag (is_numeric) hoặc dùng generated column.