Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Làm thế nào để phát hiện ký tự Trung Quốc trong MySQL?

SELECT COUNT(*)
    FROM tbl
    WHERE HEX(col) REGEXP '^(..)*(E[2-9F]|F0A)'

sẽ đếm số lượng bản ghi có các ký tự Trung Quốc trong cột col .

Vấn đề:

  • Tôi không chắc những phạm vi hex đại diện cho tiếng Trung Quốc.
  • Bài kiểm tra có thể bao gồm tiếng Hàn và tiếng Nhật. ("CJK")
  • Trong MySQL, các ký tự tiếng Trung 4 byte cần utf8mb4 thay vì utf8 .

Công phu

Tôi giả sử cột trong bảng là CHARACTER SET utf8 . Trong mã hóa utf8, các ký tự Trung Quốc bắt đầu bằng một byte giữa hex E2 và E9, hoặc EF, hoặc F0. Những cái bắt đầu bằng hex E sẽ dài 3 byte, nhưng tôi không kiểm tra độ dài; những cái F0 sẽ là 4 byte.

Regexp bắt đầu bằng ^(..)* , nghĩa là "từ đầu chuỗi (^ ), định vị 0 hoặc nhiều hơn (* ) 2 ký tự (.. ) các giá trị. Sau đó phải là E -một cái gì đó hoặc F0A . Sau đó, bất cứ điều gì có thể xảy ra. Đặc biệt hơn, E-something là E tiếp theo là bất kỳ trong số 2,3,4,5,6,7,8,9 hoặc F.

Được chọn ngẫu nhiên, tôi thấy rằng mã hóa dưới dạng 3 byte hex E88D89𠜎 mã hóa dưới dạng 4 byte hex F0A09C8E .

Tôi không biết cách tốt hơn để kiểm tra một chuỗi cho một ngôn ngữ cụ thể.

Như bạn đã thấy, REGEXP có thể khá chậm.

Bản regexp này có thể bị giết quá mức, trong đó một số ký tự không phải tiếng Trung có thể bị bắt.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Xóa phần tử mảng theo giá trị trong mysql json

  2. Thứ tự Mysql bằng cách sử dụng hai cột

  3. Không thể xóa hoặc cập nhật hàng mẹ ConstraintViolationException

  4. Mã lỗi:1222. Các câu lệnh SELECT đã sử dụng có một số cột khác nhau

  5. Kiểm tra kết nối PDO