我有一个使用 UTF-8 字符集的 MySQL 表,其中有一个名为 WORDS 的长文本类型列。此列中的值由用户输入,长度为几千个字符。
该表中有两种类型的行:
在某些行中,WORDS 值是由说英语的人组成的,并且仅包含普通英语写作中使用的字符。 (并非所有内容都必须是 ASCII,例如欧元符号 http://www.fileformat.info/info/unicode/char/20ac/index.htm在某些情况下可能会出现。)
其他行具有由亚洲语言(韩语、中文、日语以及可能的其他语言)使用者编写的 WORDS 值,其中包括英语单词和使用其本地语标字符(而不是例如日语罗马字)的亚洲语言单词的混合)。
如何编写一个查询来返回所有类型 2 的行而不返回类型 1 的行?或者,如果这很难,有没有办法查询most这样的行(这里如果我错过了一些类型 2 的行,或者包含一些类型 1 的误报,也没关系)?
更新:下面的评论建议我最好完全避免使用 MySQL 查询引擎,因为它对 unicode 的正则表达式支持听起来不太好。如果这是真的,我可以将数据提取到文件中(使用mysql -B -e "some SQL here" > extract.txt
),然后在文件上使用 perl 或类似的命令。使用这种方法的答案是可以的(但不如本地 MySQL 的好!)
理论上你可以这样做:
- 找到您要测试的 unicode 范围。
- 手动将开头和结尾编码为 UTF-8。
- 使用每个编码的开始和结束的第一个字节作为 REGEXP 的范围。
我相信 CJK 的范围与欧元符号之类的东西相距足够远,因此误报和误报很少或根本没有。
Edit:我们现在已经将理论付诸实践了!
Step 1:选择字符范围。我建议\u3000-\u9fff;易于测试,并且应该会给我们带来近乎完美的结果。
Step 2:编码成字节。(维基百科 utf-8 页面) http://en.wikipedia.org/wiki/UTF-8
对于我们选择的范围,utf-8 编码值将始终为 3 个字节,第一个字节是 1110xxxx,其中 xxxx 是 unicode 值的最高有效四位。
因此,我们想要处理 11100011 到 11101001 或 0xe3 到 0xe9 范围内的字节。
Step 3:使用非常方便的(我刚刚发现的)UNHEX 函数来制作我们的正则表达式。
SELECT * FROM `mydata`
WHERE `words` REGEXP CONCAT('[',UNHEX('e3'),'-',UNHEX('e9'),']')
刚刚尝试了一下。奇迹般有效。 :)
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)