Home » Non-English Forums » French » Convertir Données en Hexadecimal en Oracle (merged 2)
|
|
|
|
|
|
|
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680223 is a reply to message #680203] |
Wed, 29 April 2020 04:17 |
|
Moonligth
Messages: 15 Registered: April 2020
|
Junior Member |
|
|
Michel Cadot wrote on Tue, 28 April 2020 14:03
S'il s'agit d'un nombre réel sous quel format ?
Décimal fixe ?
Entier ?
D'où proviennent les données ?
En fait, il ne s'agit d'abord pas d'un problème Oracle, base de données ou SQL mais de savoir ce que sont ces données.
Si encore, vous saviez pour une donnée ce qu'elle contient peut-être serait-il possible d'en induire une règle (ce qui n'est toujours pas un problème Oracle), sinon j'ai bien peur que cela ne soit pas possible, il pourrait y avoir des dizaines d'interprétations différentes.
Je vous remercie de votre retour
En fait, pour la valeur il s'agit d'un Float, exemple 98,45309492 ...
j'ai utilisé cette requête pour decoder :
select chr(to_number('C0','xx')), chr(to_number('F1','xx')), chr(to_number('A0','xx')), chr(to_number('51','xx')), chr(to_number('3F','xx')) from dual;
Je ne trouve pas la virgule dans la chaine ... Bon, à la limite ici je trouve les nombres!
Et pour la date, je ne sais pas comment faire pour la convertir en string!
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680225 is a reply to message #680222] |
Wed, 29 April 2020 05:49 |
|
Michel Cadot
Messages: 68728 Registered: March 2007 Location: Saint-Maur, France, https...
|
Senior Member Account Moderator |
|
|
Moonligth wrote on Wed, 29 April 2020 11:08Michel Cadot wrote on Wed, 29 April 2020 01:23
Il faut se poser les questions suivantes (et y répondre) : d'où proviennent les données (quel système) ? comment ont-elles été générées ?
L'origine des données est Ms SQL server (type = image) ... puis importés vers oracle en tant Clob. J'ai choisi le type CLob car c'est le seul type avec lequel les données n'ont pas été rejeté. Avec Blob et Long Raw, les données n'ont pas pu être importés à cause de deux caractères au debut '0x'.
En revanche, je ne sais pas comment elles ont été générées !!
En fait, si je comprends, vous avez inséré la CHAINE '0x...' et non la valeur binaire 0x...
Pourquoi pas mais ce n'est alors pas de "l'hexadécmal" mais une chaîne de caractères représentant une valeur hexadécimale, le traitement est complètement différent.
Il me faut (comme demandé dans mon deuxième post) un test case pour comprendre exactement ce qu'on a.
C'est-à-dire une instruction CREATE TABLE et une instruction INSERT pour (une partie) des données qui représentent EXACTEMENT ce que vous avez en base de données.
Faite un DESC de la table et un SELECT du champ pour un enregistrement, et si possible pour un enregistrement dont vous connaissez le contenu. (en gardant que la partie date et valeur, sans la partie image ou autre de ce style).
Il me semble que vous vous ne rendez pas compte de la profondeur du problème, je vais vous montrer sur la date.
Supposons que '5A5555552F50E340' soit une chaîne de caractères en hexa représentant une date, Oracle a une procédure pour traduire cela :
SQL> select UTL_RAW.CAST_TO_VARCHAR2(hextoraw('5A5555552F50E340'))
2 from dual
3 /
UTL_RAW.CAST_TO_VARCHAR2(HEXTORAW('5A5555552F50E340'))
----------------------------------------------------------------------
ZUUU/Pã@
Visiblement ce n'est pas ça.
Supposons que c'est une valeur représentant un timestamp SQL Server comme décrit dans ce post.
Cela donne:
SQL> select TO_NUMBER('5A555555','XXXXXXXX') jours,
2 TO_NUMBER('52F50E34','XXXXXXXX')/300 secondes
3 from dual
4 /
JOURS SECONDES
---------- ----------
1515541845 4639305.56
Le nombre de secondes est supérieur à 86400, nombre de secondes dans une journée ; de plus, le numéro du jour est supérieur à 1,5 milliards quelle que soit l'origine ça ne peut marcher.
Donc ce n'est pas cela.
Supposons que cela indique un nombre de nanosecondes, cela donne:
SQL> set numwidth 30
SQL> select TO_NUMBER('5A55555552F50E34','XXXXXXXXXXXXXXXX')/1000000000 secondes
2 from dual
3 /
SECONDES
------------------------------
6509202661.386292788
Changeons ça en supposant une date Unix, cela donne:
SQL> select to_date('01/01/1970','DD/MM/YYYY')
2 + TO_NUMBER('5A55555552F50E34','XXXXXXXXXXXXXXXX')/1000000000/86400
3 from dual
4 /
TO_DATE('01/01/1970
-------------------
07/04/2176 23:51:01
Je doute que vous ayez une date en 2176.
Si on suppose que c'est une date SQL Server qui démarre au 01/01/1900, cela donne:
SQL> select to_date('01/01/1900','DD/MM/YYYY')
2 + TO_NUMBER('5A55555552F50E34','XXXXXXXXXXXXXXXX')/1000000000/86400
3 from dual
4 /
TO_DATE('01/01/1900
-------------------
08/04/2106 23:51:01
A priori toujours pas bon.
On peut tourner comme cela pendant longtemps.
De plus, suivant la manière dont la donnée a été insérée (c'est pour cela que le script est nécessaire), Oracle peut avoir traduit certains caractères si les jeux de caractères du client et de la base de données ne sont pas les mêmes, pour garantir que quel que soit le client qui la demande la chaîne de caractères soit la même puisque vous lui avez dit, en utilisant un CLOB, que c'est une chaîne de caractères et non pas des données binaires (qu'il n'aurait pas converties).
Vous voyez la difficulté ?
[Updated on: Wed, 29 April 2020 06:07] Report message to a moderator
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680229 is a reply to message #680225] |
Wed, 29 April 2020 07:39 |
|
Moonligth
Messages: 15 Registered: April 2020
|
Junior Member |
|
|
Merci beaucoup, je comprend mieux maintenant
L'origine de données est Ms SQL server .. j'ai fait un export sur un fichier text puis un import vers une table oracle. (une procedure classique).
Pour cette raison, j'ai créé une table oracle comme ceci :
data_invoice (ID number(10), DATA_LOB CLOB)
=> j'ai choisi le CLOB car lorsque j'ai mis BLOB ou LONG RAW, j'ai reçu ce message : ORA-01465 : nombre hexadécimal non valide . (si j'enlève le '0x' au debut de la chaine ... l'import passe sans problème.. Donc, j'ai préféré de garder la totalité de la chaine en changeant le BLOB par CLOB ... peut être ce n'est pas le bon choix mais c'est ça ce que j'ai fait !)
voici une selection de donnée :
- Depuis MS SQL server (l'origine) :
select id, data from deb.dbo.invoice where id = 21401;
0x0100000000000000000000006050E340000000C003EAB63F0100000001000000
- Depuis la table Oracle (donnée importé à travers un fichier texte) :
select data_clob from data_invoice where id_clob=21401;
0x0100000000000000000000006050E340000000C003EAB63F0100000001000000
Il me semble qu'il y'a les mêmes caractères !
Mais quand on cherche la taille, on voit la difference
select datalength(data) from deb.dbo.invoice where id = 21401;
32
Pour Oracle :
select length(data_clob) from data_invoice where id_clob=21401;
66
Car le binaire (dans Ms SQL server) a été transformé en Hexadecimal en Oracle, chaque bit binaire est représenté en deux bits en hexadécimal ?
Bien à vous.
[Updated on: Wed, 29 April 2020 07:50] Report message to a moderator
|
|
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680237 is a reply to message #680235] |
Wed, 29 April 2020 10:40 |
|
Michel Cadot
Messages: 68728 Registered: March 2007 Location: Saint-Maur, France, https...
|
Senior Member Account Moderator |
|
|
Quote:j'ai fait un export sur un fichier text puis un import vers une table oracle. (une procedure classique).
Je ne connais pas SQL Server donc cela a rien de classique pour moi.
Que produit l'export ? un fichier texte ? Comment a été fait cet import?
Quote:Car le binaire (dans Ms SQL server) a été transformé en Hexadecimal en Oracle, chaque bit binaire est représenté en deux bits en hexadécimal ?
En fait chaque octet du binaire a été inséré en 2 caractères hexa [0-9A-F] + le "0x" dans la table Oracle, ça fait bien 2*32+2=66.
Au moins là on sait que c'est bon.
Quel est le type de "data" dans la table SQL Server?
Quote:Pourriez-vous, s'il vous plait me dire comment je peux lire cette information avec T-sql en Ms SQL server?
Là, ne connaissant pas SQL Server, j'en ai aucune idée ; il vaudrait mieux poser la question dans un forum SQL Server.
De toute façon, il faut au moins connaître le type de donnée SQL Server.
[Updated on: Wed, 29 April 2020 10:41] Report message to a moderator
|
|
|
|
|
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680289 is a reply to message #680287] |
Tue, 05 May 2020 00:53 |
|
Michel Cadot
Messages: 68728 Registered: March 2007 Location: Saint-Maur, France, https...
|
Senior Member Account Moderator |
|
|
Quote: je ne trouve pas la valeur converti en Hex dans la chaine hexadecimal
C'est une évidence !
La dernière question, qui n'a rien à vois avec la question originale, était :
Quote:comment convertir la valeur double suivante en hexadécimal et/ou binaire :
J'ai répondu à cette question qui, je le répète, n'a, telle quelle, rien à voir avec le reste du topic.
Si la question était en fait, "comment le processus original aurait converti la valeur 202.0497288397289?", personne ne peut répondre à part celui qui a fait ces conversions, et on alors retombe dans les questions précédentes.
Avez-vous trouvé la réponse pour les dates ? Si oui, indiquez-la cela pourra aider pour les nombres.
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680332 is a reply to message #680289] |
Thu, 07 May 2020 06:30 |
|
Moonligth
Messages: 15 Registered: April 2020
|
Junior Member |
|
|
J'arrive à decoder la date (plutôt une partie de la date)
pour la chaine Hex : 0X01000000000000005A5555552F50E34000000
la date sera : 000000005A555555
select to_date('01/01/1900','dd/mm/yyyy') + to_number(substr('000000005A555555',1,8 ),'xxxxxxxx') + to_number(substr('000000005A555555',9),'xxxxxxxx')/(24*60*60) date_value
from dual;
11/01/1948
je me demande si cette chaine : 2F50E34000000 corresponde à HH24:MI:SS ? Si oui, comment faire pour extraire l'heure, minutes et secondes?
Merci
[Updated on: Thu, 07 May 2020 06:32] Report message to a moderator
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680333 is a reply to message #680332] |
Thu, 07 May 2020 07:22 |
|
Michel Cadot
Messages: 68728 Registered: March 2007 Location: Saint-Maur, France, https...
|
Senior Member Account Moderator |
|
|
SQL> select to_date('01/01/1900','dd/mm/yyyy') +
2 to_number(substr('000000005A555555',1,8 ),'xxxxxxxx') +
3 to_number(substr('000000005A555555',9),'xxxxxxxx')/(24*60*60) date_value
4 from dual;
DATE_VALUE
-------------------
10/01/1948 23:50:45
Ëtes-vous sûr que cela est correct ?
Le première partie retourne 0:
SQL> select substr('000000005A555555',1,8 ) from dual;
SUBSTR('
--------
00000000
Donc en fait, vous prenez les 8 premiers caractères de la valeur que vous m'aviez donnée originellement pour dire que ce sont des secondes depuis le 1/1/1900:
SQL> select to_date('01/01/1900','dd/mm/yyyy') +
2 to_number(substr('5A55555552F50E34',1,8),'xxxxxxxx')/(24*60*60) date_value
3 from dual;
DATE_VALUE
-------------------
10/01/1948 23:50:45
Pourquoi pas (si 1948 est une année possible dans les données) mais quel est le raisonnement ? Pourquoi pas les 9 premiers et dire que ce sont des dixièmes de secondes ?
SQL> select to_date('01/01/1900','dd/mm/yyyy') +
2 to_number(substr('5A55555552F50E34',1,9),'xxxxxxxxx')/(24*60*60)/10 date_value
3 from dual
4 /
DATE_VALUE
-------------------
03/11/1976 14:09:13
|
|
|
|
|
|
|
Re: Convertir Données en Hexadecimal en Oracle (merged 2) [message #680338 is a reply to message #680337] |
Thu, 07 May 2020 10:45 |
|
Michel Cadot
Messages: 68728 Registered: March 2007 Location: Saint-Maur, France, https...
|
Senior Member Account Moderator |
|
|
Quote:Je ne trouve pas le même résultat que la votre .. je trouve plutôt : 22/11/1765 14:59:26
Vous n'avez pas fait la même requête que moi.
Faites comme moi, copier et coller ce que vous faites et recevez.
Quote:Pourquoi vous devisez pas 1million ? que-ce que cela signifie?
Pas 1 million, 1 milliard, j'ai supposé que, vu la grandeur du nombre, c'était un compte de nanosecondes (cf. posts précédents).
Quote:Pour votre question pour j'ai considéré les 16 premiers bits la date, car ces sont les seuls bits ensemble me rendre une date lisible et correcte !!
J'ai montré qu'on pouvait faire d'autres choix et avoir une date correcte (encore faut-il savoir ce qu'est une date correcte).
De plus, si c'était juste une date, il n'y aurait pas de partie heure (ou plutôt elle serait à 00:00:00), or ce n'est pas le cas, donc les 8 premiers octets ne constituent pas une date par elle-même.
|
|
|
Goto Forum:
Current Time: Sat Dec 21 19:21:33 CST 2024
|