Les fonctions RLIKE, ou REGEXP, de MySQL (5.0) ne fonctionne pas en UTF-8
les expressions régulières sont totalement indisponibles
C'est la seule limite actuelle que j'ai rencontrer, mais elle est de taille.
La fonction LIKE marche, au contraire, avec une étonnante efficacité. Nous pouvons donc nous en contenter, pour le projet oBlog, pour la recherche de mot dans les articles. Avec toutefois la perte de fonctionnalité suivante : impossible de tester seulement des mots entiers. Et une exception particulière autour des lettres doubles comme "œ" et d'autres du même genre.
Pour la création de la base et des tables
Nos instructions tourneront autour de ces exemples :
ALTER DATABASE `sauver` DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci
CREATE DATABASE `toto` DEFAULT CHARACTER SET utf8 COLLATE
utf8_general_ci;
ALTER TABLE `ob_articles` CHANGE `art_titre` `art_titre` VARCHAR( 200
) CHARACTER SET utf8 COLLATE utf8_general_ci NOT NULL
CREATE TABLE `toto`.`article` (`texte` TEXT CHARACTER SET utf8
COLLATE utf8_general_ci NOT NULL) ENGINE = MYISAM CHARACTER SET utf8
COLLATE utf8_general_ci;
Pour interroger la base depuis le PHP
Il est important de savoir, et de déclarer, si nous fournissons des requêtes rédiger en UTF-8. Il existe une requête pour signaler à MySQL la norme utilisée pour la rédaction des requêtes suivantes. Il est préférable de la lancer directement, et systématiquement, lors de la connexion à la base.
mysql_query("SET NAMES 'utf8'")
Pour gérer les exceptions des lettres doubles
Nous créons une fonction php basé sur le tableau suivant que chacun pour mettre a jour en fonction des situation qu'il a gerer
// exemple de caracteres doubles
$caracteres_doubles [] = array('æ','ae');
$caracteres_doubles [] = array('œ','oe');
$caracteres_doubles [] = array('đ','dj');
function mot_double($mot)
{
global $caracteres_doubles;
$mot_nouveau = $mot;
foreach ($caracteres_doubles as $caractere)
$mot_nouveau = mb_ereg_replace($caractere[1],$caractere[0],$mot_nouveau);
if ($mot_nouveau <> $mot)
return $mot_nouveau;
return false;
}
Puis nous doublons la clause WHERE comme ceci
if (!is_bool($mot_nouveau=mot_double($mot)))
$where = ' WHERE ((texte LIKE "%'.$mot.'%") OR (texte LIKE "%'.$mot_nouveau.'%")) ';
else
$where = ' WHERE texte LIKE "%'.$mot.'%"';