OVH Cloud OVH Cloud

[oracle]Recherche en typographie pauvre

1 réponse
Avatar
Christophe HENRY
Bonjour à tous,

Voici une requête bien innoncente :
SELECT champ FROM table WHERE champ LIKE '%e%'

Sur Mysql, la recherche se fait en "typographie pauvre". C'est-à-dire que
tous les champs contenant un "e" mais aussi "é" "É" "è" ... sortent de
la recherche.

Sur Oracle, la recherche est stricte. On peut améliorer :
SELECT champ FROM table WHERE UPPER(champ) LIKE '%E%'
Les majuscules et les minuscules sont maintenant confondues mais pas les
variantes des lettres. "e" n'est pas confondu avec "é", "è", etc.

Existe-t-il un moyen de dire à Oracle de "faire-comme-mysql" ?

Les données en question portent sur des données encodées en utf8
contenant de l'européen, du cyrillique et du grec entre autre choses.
J'ai bien entendu parlé d'Oracle TEXT ou de TRANSLATE, mais j'avoue que
tout cela me laisse froid et perplexe.

Le problème me semblant s'imposer à toute base de données multilingue,
quelles sont les solutions habituelles ?
En bonus, si quelqu'un sait comment obliger Mysql à faire de la recherche
stricte ; en effet, même son "=" confond minuscules et majuscules.

a++

--
Christophe HENRY
forumslkm.sbgodin@nerim.net (sans lkm)
GnuPG : 3922239E60036EC86BF7268A877C52AC 4883C02A

1 réponse

Avatar
pgulutzan
Christophe HENRY wrote:
...

En bonus, si quelqu'un sait comment obliger Mysql à faire de la recherc he
stricte ; en effet, même son "=" confond minuscules et majuscules.



J'ai une colonne qui contient 'e', 'E', et 'ê'. J'utilise le 'mysql'
client avec
MySQL Version 5.1. Seulement pour cet exemple, j'utilise latin1, mais
UTF8 marche bien aussi.

mysql> set names utf8;
Query OK, 0 rows affected (0.00 sec)

mysql> create table tc (s1 char(1) character set latin1 collate
latin1_swedish_ci);
Query OK, 0 rows affected (0.00 sec)

mysql> insert into tc values ('e'),('E'),('ê');
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0

mysql> select count(*) from tc where s1 = 'e';
+----------+
| count(*) |
+----------+
| 3 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from tc where s1 collate latin1_general_ci =
'e';
+----------+
| count(*) |
+----------+
| 2 |
+----------+
1 row in set (0.00 sec)

mysql> select count(*) from tc where cast(s1 as binary(1)) = 'e';
+----------+
| count(*) |
+----------+
| 1 |
+----------+
1 row in set (0.01 sec)

Peter Gulutzan
MySQL AB