2010-04-23 71 views
0

我有我的语言(拉脱维亚语)单词字典表。如何查询MySQL的确切长度和​​确切的UTF-8字符

CREATE TABLE words (
value varchar(255) COLLATE utf8_unicode_ci DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_unicode_ci;

而且我们说,它有3次里面的话:
INSERT INTO words (value) VALUES ('tēja');
INSERT INTO words (value) VALUES ('vējš');
INSERT INTO words (value) VALUES ('feja');

我想要做的是,我想找到的所有的话,这正是长4个字符,其中第二字符是'ē',第三个字符是'j'

对我来说,感觉正确的查询是:
SELECT * FROM words WHERE value LIKE '_ēj_';
但这个查询的问题是,它并没有退回2个条目('tēja','vējš'),但所有三个。 据我所知,这是因为内部MySQL将字符串转换为一些ASCII表示形式?

再有就是BINARY除了可能LIKE
SELECT * FROM words WHERE value LIKE BINARY '_ēj_';
但是,这也并不返回2项( 'Teja公司', 'vējš'),但只有一个( 'TEJA')。我相信这与UTF-8 2字节的非ASCII字符有关?

所以问题:
什么MySQL查询将返回我确切的两个单词('tēja','vējš')?

预先感谢您

回答

0

什么MySQL查询将返回我的确切两个词( 'Teja公司', 'vējš')?

SELECT * FROM words WHERE value LIKE '_ēj_' COLLATE utf8_bin; 

utf8_bin整理不仅仅是音符敏感,而且还区分大小写。如果你只想匹配字母和变音符号,并且你不关心大写/小写,你必须要求find a utf_..._ci排序规则,它不会将eē作为同一个字母。

我不能立即看到一个(有很多不会整理ē,如果你只需要区分非变音字母的区分大小写匹配,这将是可以的)。有趣的是,Latvian collation将大写字母视为与您不想要的普通字母相同(它知道šs不同)。

无论如何,无论您最终得到什么样的排序规则,您都会希望将表格置于排序规则中,而不是在查询中手动指定它,以便可以对比较结果进行正确编制索引。

+0

谢谢你,我完全按照你所说的 - 将表格改为:CHARACTER SET utf8 COLLATE utf8_bin。我希望也使用一些cyrilic符号,所以我会坚持使用UTF-8 – oskarae 2010-04-23 23:46:09