Einzelnen Beitrag anzeigen

Morphie

Registriert seit: 27. Apr 2008
Ort: Rahden
630 Beiträge
 
#5

AW: Firebird UUID <> GUID

  Alt 17. Jan 2013, 14:46
ja, ich habe es mit 2.5.2 ansprobiert.

Du hast das Problem in deinem Beispiel nicht, weil du die 16-Byte UUID bereits mittels CHAR_TO_UUID('9B7C3C32-2B51-49D5-BB9A-7C044B91A061') anlegst...

Das Problem tritt auf, wenn man (z.B. in .NET) eine Variable vom Typ Guid hat. Wenn man sich diesen als 36-Zeichen String ausgeben lässt, bekommt man z.B. diese Darstellung:
Code:
a6ddceee-dc33-46cc-9378-75fbc4d87ef2
Intern speichert Guid aber ein Array von 16 Bytes.
Code:
238,206,221,166,51,220,204,70,147,120,117,251,196,216,126,242
Legt man jetzt einen Datensatz an und will die 16-Byte UUID übergeben, macht man das so:
Code:
INSERT INTO TABLE (ID) VALUES (@PARAMETER1)
im Parameter1 übergibt man dann das 16-Byte-Array. Hier unterscheidet sich dein Beispiel von meinem. Du übergibst die UUID mittels der (ebenfalls fehlerhaften) Funktion CHAR_TO_UUID. Diese beiden Fehler heben sich gegenseitig auf.
Übergibt man die UUID immer über den Befehl CHAR_TO_UUID merkt man den Fehler nicht. Übergibt man ihn dann irgendwann mal als Parameter, hat man das Problem.


In der Datenbank stehen anschließend im Feld ID genau diese 16 Bytes drin. Das kann man sich auch ganz gut mit folgender Abfrage ansehen:
Code:
select
ascii_val(substring(Tabelle.id from 1 for 1)),
ascii_val(substring(Tabelle.id from 2 for 1)),
ascii_val(substring(Tabelle.id from 3 for 1)),
ascii_val(substring(Tabelle.id from 4 for 1)),
ascii_val(substring(Tabelle.id from 5 for 1)),
ascii_val(substring(Tabelle.id from 6 for 1)),
ascii_val(substring(Tabelle.id from 7 for 1)),
ascii_val(substring(Tabelle.id from 8 for 1)),
ascii_val(substring(Tabelle.id from 9 for 1)),
ascii_val(substring(Tabelle.id from 10 for 1)),
ascii_val(substring(Tabelle.id from 11 for 1)),
ascii_val(substring(Tabelle.id from 12 for 1)),
ascii_val(substring(Tabelle.id from 13 for 1)),
ascii_val(substring(Tabelle.id from 14 for 1)),
ascii_val(substring(Tabelle.id from 15 for 1)),
ascii_val(substring(Tabelle.id from 16 for 1))
from Tabelle
Konvertiert man diese Bytes anschließend wieder mittels UUID_TO_CHAR zurück, bekommt man einen vom original-.NET.GUID-String abweichenden String:
Code:
EECEDDA6-33DC-CC46-9378-75FBC4D87EF2

Geändert von Morphie (17. Jan 2013 um 15:00 Uhr)
  Mit Zitat antworten Zitat