Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Jak wykryć chiński znak w MySQL?

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

policzy liczbę rekordów ze znakami chińskimi w kolumnie col .

Problemy:

  • Nie jestem pewien, jakie zakresy szesnastkowe reprezentują język chiński.
  • Test może to koreański i japoński. („CJK”)
  • W MySQL 4-bajtowe chińskie znaki wymagają utf8mb4 zamiast utf8 .

Opracowanie

Zakładam, że kolumna w tabeli to CHARACTER SET utf8 . W kodowaniu utf8 chińskie znaki zaczynają się od bajtu między szesnastkami E2 i E9 lub EF lub F0. Te zaczynające się od heksadecymalnej E będą miały długość 3 bajtów, ale nie sprawdzam długości; te F0 będą miały 4 bajty.

Wyrażenie regularne zaczyna się od ^(..)* , co oznacza „od początku ciągu (^ ), zlokalizuj 0 lub więcej (* ) 2-znakowy (.. ) wartości. Następnie powinno być albo E -coś lub F0A . Potem wszystko może się wydarzyć. E-coś to, dokładniej, E po którym następuje dowolne z 2,3,4,5,6,7,8,9 lub F.

Wybrany losowo, widzę, że koduje jako 3 bajty szesnastkowe E88D89 i 𠜎 koduje jako 4 bajty szesnastkowe F0A09C8E .

Nie znam lepszego sposobu na sprawdzenie ciągu w określonym języku.

Jak zauważyłeś, REGEXP może być dość powolny.

To wyrażenie regularne może być przesadzone, ponieważ niektóre znaki spoza Chin mogą zostać przechwycone.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Pobieranie rekordów mysql do tabeli html przy użyciu PHP

  2. Liczba kolumn mysql.proc jest nieprawidłowa. Oczekiwano 20, znaleziono 16. Tabela jest prawdopodobnie uszkodzona

  3. Po aktualizacji systemu Windows 10 1803 mój program nie może otworzyć gniazda podczas pracy z udziału sieciowego

  4. Wykonywanie wielu zapytań przy użyciu jednego obiektu instrukcji JDBC

  5. Zamiana identyfikatora użytkownika na nazwę (osobne tabele) w PHP