Insensibles à la casse REMPLACER dans MySQL?
MySQL fonctionne assez bien toutes les comparaisons de chaînes sous le classement par défaut... sauf la REPLACE
de commande. J'ai un classement de casse et de la nécessité d'exécuter un casse REPLACE
. Est-il un moyen de forcer REPLACE
à utiliser le classement actuel plutôt que de toujours faire de la casse des comparaisons? Je suis prêt à mettre à jour mon MySQL (actuellement en cours d'exécution 5.1) pour obtenir des fonctionnalités supplémentaires...
mysql> charset utf8 collation utf8_unicode_ci;
Charset changed
mysql> select 'abc' like '%B%';
+------------------+
| 'abc' like '%B%' |
+------------------+
| 1 |
+------------------+
mysql> select replace('aAbBcC', 'a', 'f');
+-----------------------------+
| replace('aAbBcC', 'a', 'f') |
+-----------------------------+
| fAbBcC | <--- *NOT* 'ffbBcC'
+-----------------------------+
Vous devez vous connecter pour publier un commentaire.
Si
replace(lower())
ne fonctionne pas, vous aurez besoin de créer une autre fonction.Mes 2 cents.
Puisque beaucoup de gens ont mis à niveau à partir de MySQL à MariaDB ces personnes auront à disposition une nouvelle fonction appelée
REGEXP_REPLACE
. L'utiliser comme vous le feriez pour un remplacer, mais le motif est une expression régulière.C'est un exemple de travail:
L'option
(?i)
rend tous les autres matches de la casse (si placé au début de la répétition, comme je l'ai ensuite tout est insensible à la casse).Voir ici pour plus d'informations: https://mariadb.com/kb/en/mariadb/pcre/
Edit: comme MySQL 8.0, vous pouvez maintenant utiliser le
regexp_replace
fonction, voir la documentation: https://dev.mysql.com/doc/refman/8.0/en/regexp.htmlAutre fonction pour celle qui est parlée par fvox.
Petit test:
Réponses:
New Kork
Je suis allé avec http://pento.net/2009/02/15/case-insensitive-replace-for-mysql/ (en fvox de réponse) qui effectue la recherche insensible à la casse avec la casse de remplacement et sans changer le cas de ce qui devrait être affectée caractères ailleurs dans la chaîne recherchée.
N. B. le commentaire plus bas sur cette même page indiquant que CHAR(255) doit être modifiée pour être de type VARCHAR(255) - cela semblait être tenus pour moi aussi.
Cette modification de Luist de réponse permet de remplacer l'aiguille avec un différemment tubé version de l'aiguille (deux lignes de changement).
Dans les réponses précédentes, et l'pento.net lien, les arguments pour
LOCATE()
sont écrit en minuscule.C'est un gaspillage de ressources, que RECHERCHEZ est insensible à la casse par défaut:
Vous pouvez remplacer
WHILE Locate( LCASE(REPLACE_THIS), LCASE(REPLACE_WHERE), last_occurency ) > 0 DO
avec
WHILE Locate(REPLACE_THIS, REPLACE_WHERE, last_occurency ) > 0 DO
etc.
Dans le cas de caractères 'spéciaux' il y a des comportements inattendus:
Donne
Qui est inattendu... puisque nous voulons remplacer l'Ã pas Un
Ce qui est encore plus bizarre:
donne
Qui est le résultat correct... semble avoir à faire avec le codage des paramètres de la procédure stockée...