2010-04-23 3 views
0

J'ai une table avec un dictionnaire de mots dans ma langue (letton).Comment interroger MySQL pour la longueur exacte et les caractères UTF-8 exacts

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

Et disons qu'il a 3 mots à l'intérieur:
INSERT INTO words (value) VALUES ('tēja');
INSERT INTO words (value) VALUES ('vējš');
INSERT INTO words (value) VALUES ('feja');

Ce que je veux faire est que je veux trouver tous les mots qui est exactement 4 caractères et où la deuxième le caractère est 'ē' et le troisième caractère est 'j'

Pour moi, il semble que la requête correcte serait:
SELECT * FROM words WHERE value LIKE '_ēj_';
Mais le problème avec cette requête est qu'elle ne renvoie pas 2 entrées ('tēja', 'vējš') mais les trois. Si je comprends bien c'est parce que MySQL interne convertit les chaînes à une représentation ASCII?

Ensuite, il y a BINARY plus possible pour LIKE
SELECT * FROM words WHERE value LIKE BINARY '_ēj_';
Mais cela ne revient pas aussi 2 entrées ('Teja', 'Vejs') mais une seule ('Teja'). Je crois que cela a quelque chose à voir avec UTF-8 2 octets pour les caractères non ASCII?

Alors question:
Quelle requête MySQL retournerait exactement mes deux mots ('tēja', 'vējš')?

Merci d'avance

Répondre

0

Quelle requête MySQL retournerait mes deux mots exacts ('tēja', 'vējš')?

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

La collation utf8_bin est non seulement sensible à la diacritique, mais aussi sensible à la casse. Si vous voulez correspondre seulement à la lettre avec diacritique et que vous ne vous souciez pas des majuscules/minuscules, vous devrez composer un utf_..._ci qui ne traitera pas e et ē comme la même lettre.

Je ne peux pas en voir un immédiatement (il y en a beaucoup qui n'assemblent pas du tout ē, ce qui serait bien si vous avez seulement besoin d'une correspondance sensible à la casse sur les lettres non-diacritiques). Intéressant que le Latvian collation traite les macron-lettres comme les lettres simples, que vous ne voulez pas (il sait š est différent de s). Quoi qu'il en soit, quel que soit le classement que vous obtiendrez, vous voudrez placer vos tables dans ce classement plutôt que de les spécifier manuellement dans une requête, afin que les comparaisons puissent être correctement indexées.

+0

Merci, je l'ai fait exactement comme vous l'avez dit - changé de table à: CHARACTER SET utf8 COLLATE utf8_bin.Je m'attends à utiliser également des symboles cyriliques, donc je m'en tiendrai à l'UTF-8 – oskarae

Questions connexes