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

Loại bỏ ký tự không chuyển được sang ASCII trong MySQL với SELECT


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.