如何使用 mysql 或 PHP 在 mysql (mariadb) 数据中查找非 UTF-8 字符

问题描述 投票:0回答:1

我正在使用

mysql 版本 15.1 Distrib 10.3.39-MariaDB,适用于 Linux (x86_64),使用 readline 5.1

PHP 8.2.13(cli)(构建:2023 年 11 月 24 日 09:33:30)(NTS)

我想使用其中一个或两个来查找 mysql 中的数据,其中 mysql 数据列已声明为字符集 utf8mb4、排序规则 utf8mb4_unicode_ci,但数据中的字符实际上不是有效的 UTF-8 字符。

我非常确定我的数据中有 Mojobake、latin1 或其他无效字符。我的数据来自政府数据库,这些数据库并没有真正筛选记者输入的内容,也没有一致的字符编码。有些角色确实看起来像垃圾角色。

但是,我尝试了各种自动检测这些的方法,但似乎都不起作用。

我已经在 mysql 中尝试过(我很确定所有默认值,例如 SET NAMES 都设置正确):

select field_name from table_name
WHERE CONVERT(field_name, binary) RLIKE '([\\xC0-\\xC1]|[\\xF5-\\xFF]|\\xE0[\\x80-\\x9F]|\\xF0[\\x80-\\x8F]|[\\xC2-\\xDF](?![\\x80-\\xBF])|[\\xE0-\\xEF](?![\\x80-\\xBF]{2})|[\\xF0-\\xF4](?![\\x80-\\xBF]{3})|(?<=[\\x00-\\x7F\\xF5-\\xFF])[\\x80-\\xBF]|(?<![\\xC2-\\xDF]|[\\xE0-\\xEF]|[\\xE0-\\xEF][\\x80-\\xBF]|[\\xF0-\\xF4]|[\\xF0-\\xF4][\\x80-\\xBF]|[\\xF0-\\xF4][\\x80-\\xBF]{2})[\\x80-\\xBF]|(?<=[\\xE0-\\xEF])[\\x80-\\xBF](?![\\x80-\\xBF])|(?<=[\\xF0-\\xF4])[\\x80-\\xBF](?![\\x80-\\xBF]{2})|(?<=[\\xF0-\\xF4][\\x80-\\xBF])[\\x80-\\xBF](?![\\x80-\\xBF]))'

我尝试在 PHP 中将 mysql 数据检索到 $string 中(我很确定我已将所有 PHP 默认值设置为使用 UTF-8),然后:

1.

if (preg_match("//u", $string)) {
  // $string is valid UTF-8
}
if (mb_detect_encoding($string,"UTF-8",TRUE)) {
  // $string is valid UTF-8
}

但是这些方法都没有检测到看起来错误的字符。

样本数据

 DROP TABLE IF EXISTS sample; 
 CREATE TABLE sample ( data text DEFAULT NULL ) 
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci; 
 INSERT INTO sample VALUES (
 'Mr. Geoffrey H. Yost, O�Melveny & Myers LLP')
 ,('Valero Refining Company � California')
 ,('El Paso Merchant Energy � Petroleum Company')
 ,('Papé Group/IFCO')
 ,('Huntons� SureCrop Farm Svc Inc dba SureCrop Farm')
 ,('developed, manufactured, marketed, tested, and sold the electronic diesel control that allowed Mercedes to manipulate emissions controls and that Bosch marketed ¢€š¬Ã…¡¬ÃƒÆ’‚¬¦¡€š¬Ã…¡¬Ãƒ€ ‚¬„¢‚¬Å¡¬¦¢€š¬Ã…¡¬ÃƒÆ’‚¬¦€š¬Ã…€œClean Diesel¢€š¬Ã…¡¬ÃƒÆ’‚¬¦¡€š¬Ã…¡¬€š¬Ã…¡<9d> to the public.'); 
php mariadb utf8mb4
1个回答
0
投票

原始数据以utf8或utf8mb4存储,但使用8位编码(如latin1)错误解码。

'�'
是 unicode 替换字符
,通常表示之前无法正确转换某些其他字符。

您可以轻松地检查这一点,例如蟒蛇

>>> 'é'.encode('raw_unicode_escape').decode('utf8')
'é'
>>> '�'.encode('raw_unicode_escape').decode('utf8')
'�'
© www.soinside.com 2019 - 2024. All rights reserved.