代码之家  ›  专栏  ›  技术社区  ›  Piotr Czapla

如何在mysql中检查二进制字符串是否为UTF-8?

  •  4
  • Piotr Czapla  · 技术社区  · 16 年前

    我发现了一个Perl regexp,它可以检查字符串是否为UTF-8(regexp来自 w3c site ).

    $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;
    

    this question .

    更新: 我需要在MySQL上执行此检查,因为我需要在服务器上运行它来更正损坏的表。我无法通过脚本传递数据,因为数据库大约为1TB。

    2 回复  |  直到 9 年前
        1
  •  3
  •   Piotr Czapla    16 年前

    我已经通过一个测试修复了我的数据库,这个测试只有在你的数据可以用一个字节的编码表示的情况下才有效。在我的例子中,它是一个拉丁1。

    我使用了mysql将非utf-8的字节转换为拉丁文1的事实。

    以下是支票的外观:

    SELECT (
             CONVERT(
               CONVERT(
                  potentially_broken_column 
               USING latin1) 
             USING utf8))
           != 
           potentially_broken_column) AS INVALID ....
    
        2
  •  0
  •   Community Mohan Dere    9 年前

    如果您同时控制该数据库的输入端和输出端,那么您应该能够验证您的数据在您喜欢的哪一侧是UTF-8,并根据需要实施约束。如果您处理的是一个不控制输入端的系统,那么您必须在将其取出并可能使用您选择的语言(听起来像Perl)进行转换之后对其进行检查。

    数据库是一个非常好的存储工具,但不应被积极地用于其他应用程序。我认为这是一个你应该让MySQL保存数据的地方,直到你需要进一步处理它。

    如果您想继续您所在的路径,请查看此MySQL手册页面: http://dev.mysql.com/doc/refman/5.0/en/regexp.html

    德国劳埃德船级社!

    编辑:看看这篇堆栈文章——考虑到无法使用脚本处理数据,您可能希望使用存储过程: Regular expressions in stored procedures