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
zamiastutf8
.
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.