我发现了一个Perl正则表达式,可以检查一个字符串是否为UTF-8编码(该正则表达式来自w3c网站)。
$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不支持字符的十六进制表示,请参见这个问题。
你有什么想法可以将正则表达式移植到MySQL吗? 或者你知道其他检查字符串是否有效UTF-8的方法吗?
更新: 我需要在MySQL上运行此检查,以便在服务器上纠正损坏的表。由于数据库大小约为1TB,我无法通过脚本传递数据。