我找到了一个 Perl 正则表达式,可以检查字符串是否为 UTF-8(正则表达式来自w3c site http://www.w3.org/International/questions/qa-forms-utf-8.en.php).
$field =~
m/\A(
[\x09\x0A\x0D\x20-\x7E] # ASCII
| [\xC2-\xDF][\x80-\xBF] # non-overlong 2-byte
| \xE0[\xA0-\xBF][\x80-\xBF] # excluding overlongs
| [\xE1-\xEC\xEE\xEF][\x80-\xBF]{2} # straight 3-byte
| \xED[\x80-\x9F][\x80-\xBF] # excluding surrogates
| \xF0[\x90-\xBF][\x80-\xBF]{2} # planes 1-3
| [\xF1-\xF3][\x80-\xBF]{3} # planes 4-15
| \xF4[\x80-\x8F][\x80-\xBF]{2} # plane 16
)*\z/x;
但我不知道如何将它移植到MySQL,因为MySQL似乎不支持字符的十六进制表示,请参阅这个问题 https://stackoverflow.com/questions/2199501/hex-characters-in-regexp-matching-in-mysql/2199565.
有什么想法如何将正则表达式移植到 MySQL 吗?
或者也许您知道任何其他方法来检查字符串是否是有效的 UTF-8?
UPDATE:我需要在 MySQL 上进行此检查,因为我需要在服务器上运行它来纠正损坏的表。我无法通过脚本传递数据,因为数据库约为 1TB。
我已经设法使用一个测试修复我的数据库,该测试仅当您的数据可以使用单字节编码表示时才有效,在我的情况下它是 latin1。
我已经使用了 mysql 将非 utf-8 的字节更改为“?”的事实转换为 latin1 时。
支票如下所示:
SELECT (
CONVERT(
CONVERT(
potentially_broken_column
USING latin1)
USING utf8))
!=
potentially_broken_column) AS INVALID ....
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)