PostgreSQL La base de donnees la plus sophistiquee au monde.

Forums PostgreSQL.fr

Le forum officiel de la communauté francophone de PostgreSQL

Vous n'êtes pas identifié(e).

#1 17/11/2012 13:49:40

CommanderTX
Membre

[Résolu] Utilisation de ASCII - CHR et le caractère NULL

Bonjour à tous,

Voilà je suis en train d'essayer de convertir une procédure stockée créée sous MySQL vers Postgresql or je suis confronté à un problème bien particulier :
la conversion du caractère null en ASCII et inversement.

Ma procédure repose sur le principe du cryptage XOR qui consiste à crypter avec un mot clé une chaîne de caractères.
Dans ma procédure la première étape consiste à convertir chaque lettre du mot clé est en code ASCII puis pour chaque code ASCII obtenu conversion en binaire sur 8 bits et je fais de même pour le texte que je souhaite crypter.
Ex avec le mot : MESSAGE (conversion ascii) => 77   69   83   83   65   71   69  (conversion binaire) => 01001101  01000101   01010011   01010011   01000001   01000111  01000101

Maintenant il peut arriver dans certains cas que lorsque j'applique le XOR je me retrouve avec 8 bits à 0, lorsque je convertit en code ASCII j'obtiens donc 0 et pour obtenir le caractère correspondant à 0 j'applique sous MySQL CHAR(0) qui donne '\0' le caractère NULL mais sous PostgreSQL j'obtiens : CHR(0) =>  null character not permitted.

Pour moi la conversion de MySQL vers PostgreSQL me paraît impossible vu que le caractère Null n'existe pas mais je vous pose quand même la question :
Est ce qu'il y'a moyen de contourner le problème du caractère NULL sous PostGresql ?

En vous remerciant par avance,
cordialement,
Franck

Dernière modification par CommanderTX (26/11/2012 08:31:23)

Hors ligne

#2 18/11/2012 09:05:22

gleu
Administrateur

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

J'avoue que je ne comprends pas le problème que vous avez. Vous ne pouvez pas avoir de caractère 0x00 dans un champ de type texte dans PostgreSQL. Donc vous ne risquez pas d'avoir à le convertir. Pouvez-vous fournir un exemple contenant ce caractère ?

Si vous avez besoin de saisir un octet 0x00, dans ce cas, vous devez utiliser le type bytea, qui est en gros un champ d'octets, quelqu'il soit.


Guillaume.

Hors ligne

#3 18/11/2012 12:58:13

CommanderTX
Membre

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

En fait si ^^
Je vais prendre un cas simple.
Je veux crypter le mot "message" avec le mot clé "passage"

Sous Mysql :
J'appelle ma procédure stockée qui va faire le boulot de cryptage et de stockage de la chaine cryptée dans un champ de type BLOB.
Le principe du cryptage est simple dans ce cas là : la lettre "m" du mot "message" va être codé avec la lettre "p" de ma clé "passage",
la lettre "e" de message va être cryptée avec la lettre "a" de la clé "passagge" et ainsi de suite.

Le codage consiste pour chaque lettre de convertir la lettre en code ASCII puis en binaire sur 8 bits et d'appliquer sur les 2 binaires obtenue le XOR.
Dans le cas ci-dessus lorsque je vais arriver au codage de la lettre "a" de mon mot avec la lettre "a" de ma clé, je me retrouve avec code ASCII = 61, puis binaire de 61 = 01100001
Quand j'applique le XOR sur les 2 binaires qui sont du coup identiques j'obtiens : 00000000
Ce binaire je le reconverti en code ASCII, j'obtiens 0, et je convertit 0 en lettre avec CHAR(0) j'obtiens : '\0' qui est le caractère NULL

Sous PostgreSQL : si je veux faire la même chose avec le cas ci-dessus je suis coincé car CHR(0) =>  null character not permitted.

Je ne trouve donc pas de solution, peut être la piste de tout stocker dans un bytea en faisant en sorte que si mon binaire sur 8 bits est null je n'applique pas un CHR(0) mais je stocke directement la valeur 0x00 dans le bytea...

Dernière modification par CommanderTX (18/11/2012 13:00:18)

Hors ligne

#4 18/11/2012 13:32:31

rjuju
Administrateur

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

Vous pouvez aussi regarder du coté du module pg_crypto qui intègre des fonctions de chiffrement (avec un stockage en bytea).

Hors ligne

#5 19/11/2012 14:46:17

gleu
Administrateur

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

OK, je comprends mieux. Vous n'avez pas d'autres choix que de stocker vos données chiffrées dans un champ de type bytea. Vous pouvez aussi utiliser un Large Object mais c'est certainement trop complexe pour ce que vous voulez faire (et ça n'a aucun avantage dans votre cas, par rapport à un bytea). Donc bytea.


Guillaume.

Hors ligne

#6 19/11/2012 20:54:51

CommanderTX
Membre

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

Oui effectivement le bytea me parait bien, par contre j'ai pas du comprendre comment ajouter le caractère null (0x00) dans le bytea.
Quand je fais une concaténation du type :
texteBinaire bytea;
texteBinaire := 'a' || '0x00' || 'b';   

Je me retrouve avec un texte de taille 6 au lieu de 3.
Si je fais autrement :     
texteBinaire bytea;
texteBinaire := 'a' || NULL || 'b';

La chaîne est vide.

EDIT :
Je pense avoir trouvé et je suppose qu'il doit y'avoir plus simple mais comme je débute en postgresql ^^, voilà ma piste:
texteBinaire bytea;
texteBinaire := 'a' || decode('\\000','escape') || 'b';

avec decode('\\000','escape') qui renvoie un bytea du caractère null

J'espère que c'est bien ça ^^

EDIT 2 :
Arf non c'est pas ça hmm

Dernière modification par CommanderTX (19/11/2012 21:36:57)

Hors ligne

#7 22/11/2012 20:10:14

CommanderTX
Membre

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

Quelqu'un à une idée ?

Hors ligne

#8 25/11/2012 11:31:29

gleu
Administrateur

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

Ceci fonctionne pour moi :

postgres=# select 'a'||E'\\000'::bytea||'b';
?column?
----------
a\000b
(1 row)

postgres=# select pg_typeof('a'||E'\\000'::bytea||'b');
pg_typeof
-----------
bytea
(1 row)

postgres=# select length('a'||E'\\000'::bytea||'b');
length
--------
      3
(1 row)

(testé sur une 9.2)


Guillaume.

Hors ligne

#9 26/11/2012 08:30:16

CommanderTX
Membre

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

Ah oui super ça marche, c'est exactement ce que je voulais faire !
Merci beaucoup smile

Hors ligne

#10 12/11/2013 12:49:12

aleezysam
Membre

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

J'aimerais savoir si vous connaissez une façon de faire gratuite et efficace pour comparer deux bases de données similaires pour faire ressortir les différences mineures et majeures dans leur structure (tables, champs, types de données, contraintes, etc.)?


Get fast success in pass4sure coupon code and ECCOUNCIL exam questions by using our latest exam University of California, Los Angeles .We also offer up-to-date wikipedia and answers for your prep of selftestengine.

Hors ligne

#11 12/11/2013 15:38:05

rjuju
Administrateur

Re : [Résolu] Utilisation de ASCII - CHR et le caractère NULL

Bonjour,

merci de créer une nouvelle discussion pour toute nouvelle question.

Hors ligne

Pied de page des forums