Dựa trên câu trả lời đúng, nhưng cũng có tính đến các ký tự điều khiển ASCII, giải pháp hoạt động cho tôi là:
SELECT * FROM `table` WHERE NOT `field` REGEXP "[\\x00-\\xFF]|^$";
Nó làm điều tương tự: tìm kiếm vi phạm phạm vi ASCII trong một cột, nhưng cho phép bạn tìm kiếm các ký tự điều khiển, vì nó sử dụng ký hiệu thập lục phân cho các điểm mã. Vì không có so sánh hoặc chuyển đổi [không giống như câu trả lời của @Ollie], điều này cũng sẽ nhanh hơn đáng kể. [Đặc biệt nếu MySQL thực hiện chấm dứt sớm trên truy vấn regex, điều mà nó chắc chắn nên.]
Nó cũng tránh các trường trả lại có độ dài bằng không. Nếu bạn muốn một phiên bản dài hơn một chút có thể hoạt động tốt hơn, bạn có thể sử dụng điều này thay thế:
SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
Nó thực hiện một kiểm tra riêng cho chiều dài để tránh kết quả có độ dài bằng không, mà không xem xét chúng cho một đường chuyền regex. Tùy thuộc vào số lượng các mục có độ dài bằng không bạn có, điều này có thể nhanh hơn đáng kể.
Lưu ý rằng nếu bộ ký tự mặc định của bạn là một cái gì đó kỳ quái trong đó 0x00-0xff không ánh xạ tới các giá trị giống như ASCII [có một ký tự như vậy được đặt ở bất cứ đâu không?], Điều này sẽ trả về một dương tính giả. Nếu không, hãy tận hưởng!
Trong cơ sở dữ liệu của mình, tôi đã phạm một sai lầm nhỏ bằng cách chèn một khoảng trống [ký tự không gian] sau một giá trị như thế này:
INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
Khi thực hiện một truy vấn đơn giản trong mysqlworkbench:
SELECT * from MYTABLE;
Bảng cho thấy
-------------------------------
| country_name | code | value |
-------------------------------
| France | FR | 345 |
-------------------------------
etc...
Ký tự không gian không thể nhìn thấy trong đầu ra.
Bởi vì chúng tôi có thể gỡ lỗi ứng dụng của chúng tôi, chúng tôi đã tìm thấy ký tự không gian thêm nhưng nếu bạn không biết phải tìm gì, thì rất khó để bắt được loại lỗi đó.
Có cách nào để cho MySQLworkBench hiển thị những ký tự đặc biệt đó không?
Là một cách giải quyết, tôi đã sử dụng truy vấn này:
SELECT t.id, CONCAT["'", t.country_name, "'"] AS Country,
CONCAT["'", t.code, "'"] AS CountryCode,
t.value
FROM MYTABLE t
Nhưng bạn phải biết cột nào là
SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
1 và cái nào không [ví dụ: giá trị là một số].Phiên bản tôi sử dụng là: mysqlworkbench 6.0.8.11354 Build 833
Đăng vào ngày 19 tháng 12 năm 2021
Tìm hiểu cách thoát khỏi các ký tự đặc biệt trong câu lệnh Chọn MySQL
Khi bạn viết một truy vấn MySQL, có thể đôi khi bạn cần đưa các ký tự đặc biệt vào tuyên bố của mình.
Ví dụ: giả sử bạn muốn bao gồm một biểu tượng báo giá
SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
2 bên trong câu lệnh SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
3 của bạn như thế này:SELECT 'Hello, I'm Nathan';
Truy vấn trên sẽ kích hoạt
SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
4 bởi vì bạn đang đặt một ký hiệu báo giá SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
2 mà Lừa sử dụng làm dấu phân cách cho chuỗi.Để sửa lỗi, bạn cần thoát khỏi ký tự khỏi được hiểu là dấu phân cách của một chuỗi.
Trong MySQL, bạn có thể thoát khỏi các ký hiệu báo giá bằng cách xen kẽ giữa các ký hiệu trích dẫn đơn và kép.
Nếu bạn sử dụng một ký hiệu trích dẫn duy nhất trong chuỗi của mình, hãy sử dụng trích dẫn kép cho dấu phân cách chuỗi như được hiển thị bên dưới:
SELECT "Hello, I'm Nathan";
-- Output:
-- +-------------------+
-- | Hello, I'm Nathan |
-- +-------------------+
-- | Hello, I'm Nathan |
-- +-------------------+
Bạn cũng có thể làm điều đó như thế này:
SELECT 'Hello, I"m Nathan';
-- Output:
-- +-------------------+
-- | Hello, I"m Nathan |
-- +-------------------+
-- | Hello, I"m Nathan |
-- +-------------------+
Ngoài ra, MySQL cũng có trình tự thoát ký tự đặc biệt như được hiển thị bên dưới:
6 - ký tự ASCII NUL [0x00].SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
7 - một ký tự trích dẫn [SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
2].SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
9 - ký tự trích dẫn kép [SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
0].INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
1 - một ký tự backspace.INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
2 - một ký tự dòng mới [linefeed].INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
3 - Một nhân vật trở lại vận chuyển.INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
4 - một ký tự tab.INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
5 - ASCII 26 [Control -Z].INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
6 - ký tự dấu gạch chéo ngược [INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
7].INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
8 - một ký tựINSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
9.INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
0 - một ký tựSELECT * from MYTABLE;
1.SELECT * from MYTABLE;
Bằng cách sử dụng cú pháp trên, bạn có thể thêm các ký tự được đề cập mà không được giải thích bởi MySQL.
Hãy xem ví dụ sau:
SELECT 'Hello, I\'m Nathan';
-- Output:
-- +-------------------+
-- | Hello, I'm Nathan |
-- +-------------------+
-- | Hello, I'm Nathan |
-- +-------------------+
Để thêm ký tự mới, hãy sử dụng chuỗi thoát
INSERT INTO MYTABLE[country_name, code, value] values ['France', 'FR ', 345];
2 như hình dưới đây:SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
0Và đó là cách mà bạn bao gồm các ký tự đặc biệt trong truy vấn MySQL
SELECT * FROM `table` WHERE `field` "" AND NOT `field` REGEXP "[\\x00-\\xFF]";
3.