2010-11-10 2 views
1

J'ai une fonction de recherche, je veux que ce soit insensible à la casse, y compris des personnages comme EUO etc.MySQL UPPER() et inférieur() ne fonctionne pas avec utf-8 caractères

, je transforme l'entrée en majuscules avant d'interroger la base de données. Mais MySQL ne convertit pas les caractères accentués correctement. J'ai MySQL 5.1.32, j'ai essayé différents classements mais aucun ne semble fonctionner correctement. Même chose avec LOWER().

CREATE TABLE `items` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `name` varchar(255) DEFAULT NULL, 
    `description` text CHARACTER SET utf8 COLLATE utf8_bin, 
    PRIMARY KEY (`id`) 
) ENGINE=MyISAM AUTO_INCREMENT=187 DEFAULT CHARSET=utf8" 

Le champ de description contient 'hellö'. Mysql le convertit en 'HELLö'. Je veux 'HELLÖ'.

+1

S'il vous plaît poster le résultat de SHOW CREATE TABLE points'une, la valeur de la 'input' de $ et la valeur de' name' que vous attendez de match. – Quassnoi

+0

Fait! (également changé en champ de description au lieu de nom) –

+0

vous utilisez 'UTF8_BIN' qui est sensible à la casse et à l'accent. Utilisez 'UTF8_GENERAL_CI' à la place. – Quassnoi

Répondre

1

Cela fonctionne pour moi:

CREATE TABLE items (id INT NOT NULL, name VARCHAR(100) COLLATE UTF8_GENERAL_CI) ENGINE=InnoDB; 

INSERT 
INTO items 
VALUES (1, 'Eyjafjallajökull'); 

SELECT * 
FROM items 
WHERE name = 'EYJAFJALLAJOKULL'; 

-- 
1  Eyjafjallajökull 

SELECT UPPER('Eyjafjallajökull') 
FROM items; 

-- 
EYJAFJALLAJÖKULL 
+0

Mais ce n'est pas son point. Si je le comprends correctement, son problème est que UPPER ("Eyjafjallajökull") 'renvoie" EYJAFJALLAJöKULL' –

+0

Mais à la réflexion, cela fixe bien sûr son exigence initiale donc +1 :) –

+0

Bizarre, cela fonctionne aussi pour moi. Aussi avec MyISAM au lieu de InnoDB. Je ne comprends pas la différence. –

Questions connexes