Vấn đề
Dữ liệu chứa ký tự đặc biệt (€, §...) không có trong bảng mã ASCII. Cần loại bỏ chúng khi SELECT.
Giải pháp: CONVERT ... USING ASCII + REPLACE
SELECT REPLACE(CONVERT(Value USING ASCII), '?', '') FROM DemoTable;
Ví dụ minh họa
Tạo bảng và chèn dữ liệu có ký tự đặc biệt
mysql> CREATE TABLE DemoTable (Value VARCHAR(100));
mysql> INSERT INTO DemoTable VALUES ('€986'), ('§97');
Xem dữ liệu gốc
mysql> SELECT * FROM DemoTable;
+--------+ | Value | +--------+ | €986 | | §97 | +--------+
Truy vấn loại bỏ ký tự non-ASCII
mysql> SELECT REPLACE(CONVERT(Value USING ASCII), '?', '') FROM DemoTable;
Kết quả
+--------------------------------------------+ | REPLACE(CONVERT(Value USING ASCII), '?', '') | +--------------------------------------------+ | 986 | | 97 | +--------------------------------------------+
Giải thích
CONVERT(Value USING ASCII): Chuyển chuỗi sang charset ASCII. Ký tự không thể chuyển → thành '?'.REPLACE(..., '?', ''): Xóa các dấu '?' thay thế.
⚠️ Hạn chế
- Nếu dữ liệu gốc có sẵn ký tự '?' hợp lệ, cũng bị xóa mất.
- Chỉ giữ lại ký tự ASCII cơ bản (A-Z, a-z, 0-9, punctuation cơ bản).
- Ký tự có dấu tiếng Việt (à, á, ạ...) cũng bị chuyển thành '?' rồi xóa.
Cách tốt hơn cho Unicode (giữ chữ cái, xóa symbol)
-- MySQL 8.0: REGEXP_REPLACE giữ chữ/số, xóa symbol SELECT REGEXP_REPLACE(Value, '[^a-zA-Z0-9 ]', '') FROM DemoTable;
Hoặc dùng application code (PHP, Python...) xử lý Unicode chuẩn xác hơn.