如何在MySQL中查询包含亚洲语言字符的文本?

时间:2011-02-19 14:03:05

标签: mysql perl unicode

我有一个使用UTF-8字符集的MySQL表,其中一列名为WORDS,类型为longtext。此列中的值由用户输入,长度为几千个字符。

此表中有两种类型的行:

  1. 在某些行中,WORDS值由英语发音者组成,仅包含普通英语写作中使用的字符。 (并非所有都必须是ASCII,例如在某些情况下可能会出现euro symbol。)

  2. 其他行包含由亚洲语言(韩语,中文,日语和其他可能的其他人)编写的WORDS值,其中包括使用其原生语言字符的亚洲语言中的英语单词和单词的混合(而不是例如,日本罗马寺。

  3. 如何编写将返回类型2的所有行且不返回类型1的行的查询?或者,如果这很难,有没有办法查询大多数这样的行(如果我错过了类型2的几行,或者包含一些类型1的误报,那么可以这样做)?

    更新:下面的评论表明我可能会更好地避免使用MySQL查询引擎,因为它对unicode的正则表达式支持听起来不太好。如果这是真的,我可以将数据提取到文件中(使用mysql -B -e "some SQL here" > extract.txt),然后在文件上使用perl或类似文件。使用这种方法的答案可以(但不如原生的MySQL那样好!)

2 个答案:

答案 0 :(得分:2)

理论上你可以这样做:

  1. 找到要测试的unicode范围。
  2. 手动将开头和结尾编码为UTF-8。
  3. 使用每个编码的开始和结束的第一个字节作为REGEXP的范围。
  4. 我相信CJK范围远远超出了欧元符号这样的误报,即假阳性和假阴性很少或没有。

    编辑:我们现在已将理论付诸实践!

    第1步:选择字符范围。我建议\ u3000- \ u9fff;易于测试,应该给我们近乎完美的结果。

    第2步:编码为字节。 (Wikipedia utf-8 page)

    对于我们选择的范围,utf-8编码值将始终为3个字节,第一个为1110xxxx,其中xxxx是unicode值的最重要的四位。

    因此,我们希望在11100011到11101001或0xe3到0xe9范围内的马赫数字。

    第3步:使用非常方便的(我刚刚发现的)UNHEX函数制作正则表达式。

    SELECT * FROM `mydata`
    WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
    

    试了一下。奇迹般有效。 :)

答案 1 :(得分:0)

您还可以使用角色的十六进制值。 SELECT * FROM table WHERE <hex code>

使用SELECT HEX(column) FROM table

试用

这也可能有助http://dev.mysql.com/doc/refman/5.0/en/faqs-cjk.html