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ą
utf8mb4zamiastutf8.
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.