仅选择中文,仅限日语和仅限韩语在mysql / php中记录

时间:2011-07-06 11:18:49

标签: php mysql utf-8 cjk

有没有办法选择只有中文,只有日文和只有韩文的mysql单词?

英语可以通过以下方式完成:

SELECT * FROM table WHERE field REGEXP '[a-zA-Z0-9]'

甚至是“脏”的解决方案,如:

SELECT * FROM table WHERE field > "0" AND field <"ZZZZZZZZ"

东方语言/ CJK字符是否有类似的解决方案?

据我所知,中文和日文共享字符,所以使用这些字符的日语单词有可能被误认为是中文单词。我猜这些话不会被过滤掉。

单词存储在utf-8字符串字段中。

如果在mysql中无法完成,可以在PHP中完成吗?

谢谢! :)

编辑1:数据不包含字符串的语言,因此我无法按其他字段进行过滤。 编辑2:使用像bing这样的翻译api(谷歌正在关闭他们的翻译api)是一个有趣的想法,但我希望有一个更快的正则表达式解决方案。

4 个答案:

答案 0 :(得分:3)

MySQL regexp不直接支持搜索UTF-8字符范围。请参阅regexp的mySQL参考,其中包含:

  

警告REGEXP和RLIKE运算符   以字节方式工作,所以他们是   不是多字节安全,可能会产生   多字节的意外结果   字符集。

幸运的是,在PHP中,您可以构建这样的正则表达式,例如与

/[\x{1234}-\x{5678}]*/u

(注意regexp末尾的u)。因此,您需要为不同的语言找到合适的范围。使用unicode code charts将允许您为该语言选择适当的脚本(尽管不直接使用语言本身)。

答案 1 :(得分:1)

你不能单独从字符集中做到这一点 - 特别是在现代亚洲文本经常被“罗马化”的时候,也就是说,用罗马文字书写,如果你只是想选择表面上的文字'亚洲',有很多方法可以做到这一点取决于你想要的复杂程度以及你需要的准确程度。

但老实说,我建议您在您的数据库中添加一个新的“语言”字段,并确保它已正确填充。

也就是说,这里有一些您可能感兴趣的有用链接:

后者实施起来相对复杂,但会产生更好的结果。

或者,我相信谷歌有一个(在线)API,可以让你检测,并翻译一种语言。

一篇有趣的论文应该证明这种练习是徒劳的:

最后,你问:

  

如果不能在mysql中完成 - 如何在PHP中完成?

在PHP中执行此操作可能要容易得多,因为您可以更好地对相关语言字符串执行数学分析,尽管您可能希望将结果作为一种kludgy方式反馈到数据库中出于性能原因缓存结果。

答案 2 :(得分:0)

您可以考虑另一个包含单词和/或字符的数据结构,以及您想要与之关联的语言。

正常的东部ascii字符将与更多语言相关联,而不仅仅是英语,就像其他字符可能不仅仅是中文一样。

答案 3 :(得分:0)

韩国人大多使用自己的名为Hangul的字母。偶尔会有一些汉字出现。

日本人使用三种书写系统。其中,片假名和平假名是日本人独有的,因此几乎没有用过韩文或中文。

日文和中文都使用汉字,虽然这意味着相同的Unicode范围,所以没有简单的方法可以根据字符范围单独区分它们!

虽然有一些启发式。

中国大陆使用简体字,其中许多都是独一无二的,因此很难用于日文或韩文。

日本还简化了少数常见字符,其中许多字符都是独一无二的,因此几乎不会用于中文或韩文文本。

但肯定有很多场合,相同的字符串都是日文和中文都有效,特别是在字符串很短的情况下。

一种适用于所有文本的方法是查看字符组。这意味着像阿拉法昂恩在他们的回答中提到的n-gram和可能马尔可夫模型。但请注意,即使这在非常短的字符串的情况下也不是万无一失的!

当然,这些都不会在任何数据库软件中实现,所以你必须用你的编程语言来实现。