Comparaison de chaînes avec 4D v11 SQL

Support Technique 4D

- Titre : Comparaison de chaînes avec 4D v11 SQL

- Auteur : Support Technique 4D

- Parution : 10 mars 2009

- Licence : Copyright ® 2009 4D s.a.s. Aucune reproduction, même partielle, ne peut être faite de ce site et de l'ensemble de son contenu : textes, documents, images, etc. sans l'autorisation expresse de l'auteur. Sinon vous encourez selon la loi jusqu'à trois ans de prison et jusqu'à 300 000 € de dommages et intérêts.

Sommaire

Produit : 4D v11 SQL  ·  Plateforme : Windows, MacOSX ♪

Dans les versions précédentes, il y a toujours eu deux manières de comparer les chaînes avec 4D :

· la commande Position
ou
· l'opérateur de comparaison "="

4D v11 SQL supporte maintenant l'Unicode de manière native. Ce qui implique que toutes les comparaisons de chaîne doivent être conformes aux normes Unicode. Il y a certains caractères en particulier que 4D est forcé d'ignorer lors de la vérification d'une chaîne.

Voici un exemple qui illustre ce propos :

Code 4D

C_TEXTE($lhs;$rhs)
$lhs:="A"+Caractere(0)+"B"
$rhs:="A"+Caractere(3)+"B"

C_BOOLEEN($b)
$b:= ($lhs=$rhs)

Si ($b)
ALERTE("Vrai")
Sinon
ALERTE("Faux")
Fin de si

Avec 4D 2004, $b retournera Faux parce que Caractere(0) n'est pas le même que Caractere(3).
Selon l'Unicode, Caractere(0) est réservé et est exclu de la comparaison : $b retourne Vrai.
Et ce n'est qu'un exemple.

Le fait d'être sensible ou non à la casse et aux caractères diacritiques est deux autres facteurs à prendre en considération.

La commande Position a été modifiée dans la version 4D v11 SQL pour pouvoir donner au développeur le contrôle complet sur la comparaison.
Précisément, le passage du paramètre "*" de la commande Position l'oblige à être sensible à la casse, aux signes diacritiques, et aux caractères "nulls".

Code 4D

C_TEXTE($lhs;$rhs)
$lhs:="A"+Caractere(0)+"B"
$rhs:="A"+Caractere(3)+"B"

C_ENTIER LONG($pos)
$pos:=Position($lhs;$rhs;*)

Si ($pos>0)
ALERTE("Vrai")
Sinon
ALERTE("Faux")
Fin de si

Le code ci-dessus retourne Faux parce que les deux caractères "nulls" ne correspondent pas.

Pour effectuer la comparaison sans tenir compte de la casse (mais en conservant la sensibilité aux caractères diacritiques et aux caractères "nulls"), il suffit d'utiliser les commandes Majuscule ou Minuscule pour standardiser les chaînes à comparer.

Code 4D

C_TEXTE($lhs;$rhs)
$lhs:="A"+Caractere(0)+"B"
$rhs:="A"+Caractere(3)+"b"

C_ENTIER LONG($pos)
$pos:=Position(Majusc($lhs);Majusc($rhs);*)

Si ($pos>0)
ALERTE("Vrai")
Sinon
ALERTE("Faux")
Fin de si