Mysql
 sql >> база данни >  >> RDS >> Mysql

Как да открием китайски символ в MySQL?

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

ще преброи броя на записите с китайски знаци в колона col .

Проблеми:

  • Не съм сигурен кои диапазони от шестнадесетичен символ представляват китайски.
  • Тестът може включват корейски и японски. („CJK“)
  • В MySQL 4-байтовите китайски знаци се нуждаят от utf8mb4 вместо utf8 .

Разработка

Предполагам, че колоната в таблицата е CHARACTER SET utf8 . При utf8 кодиране китайските знаци започват с байт между шестнадесетичен E2 и E9, или EF, или F0. Тези, които започват с шестнадесетичен E, ще бъдат дълги 3 байта, но не проверявам дължината; F0 ще бъдат 4 байта.

Редовният израз започва с ^(..)* , което означава "от началото на низа (^ ), намерете 0 или повече (* ) 2-знака (.. ) стойности. След това трябва да бъде или E -нещо или F0A . След това всичко може да се случи. E-нещо е по-точно E последвано от някое от 2,3,4,5,6,7,8,9 или F.

Избрано на случаен принцип, виждам, че кодира като 3 шестнадесетични байта E88D89 и 𠜎 кодира като 4 шестнадесетични байта F0A09C8E .

Не знам по-добър начин да проверя низ за конкретен език.

Както открихте, REGEXP може да бъде доста бавен.

Това редовно изражение може да бъде прекомерно убито, тъй като някои некитайски знаци могат да бъдат уловени.




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Как мога да създам приложение за Android с локална база данни MySQL?

  2. Изпълнението на MySQL израза отнема повече от минута

  3. Как мога да направя заявка за таблица в таблица?

  4. MySQL заявка за връщане на редове, които са равни или по-големи от определена дата, където датата е разделена на колони за година, месец и ден

  5. Самореферентни ManyToMany Тип връзкаORM