Guid-Felder unter FB

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
MBickel
Beiträge: 16
Registriert: Fr 2. Okt 2009, 10:11
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hessen

Guid-Felder unter FB

Beitrag von MBickel »

Hallo,

für eine FB-Tabelle habe ich ein Feld erstellt:
iGuid VARCHAR(16) CHARACTER SET OCTETS COLLATE OCTETS

mit einem entsprechenden Trigger

If (new.iGUID is null) then new.iGUID = gen_uuid()

Dies funktioniert auch.
Schaue ich mir den Inhalt an, so enthalten die Felder eine kryptische Zeichenfolge wie
-> '7CŽ[¯H‰¯8'

Unter NexusDB (mit Delphi) gibt es praktischer Weise sowas fertig (Guid-Feldtype und ein Default Descriptor)
und die Zeichenfolge im entsprechenden Feld sieht dann auch so aus, wie ich es erwarten würde:

{8B1B1FD5-4694-4205-992C-38B29CCF6C16}

Frage: ist das unter FB korrekt, oder sollte ich für den Feldtyp etwas anderes einstellen?

Danke und viele Grüße
Michael

knight
Beiträge: 802
Registriert: Mi 13. Sep 2006, 22:30

Re: Guid-Felder unter FB

Beitrag von knight »

Ich würde mal auf ein Problem mit der Zeichencodierung tippen. Lazarus verwendet standardmäßig UTF8. Wenn in deiner Datenbank eine andere Kodierung verwendet wird, dann kann es zu solchen Anzeigeproblemen kommen. Entweder baust du in dem Fall Konvertierungsroutinen ein oder du änderst die Kodierung in der Datenbank.

knight

MBickel
Beiträge: 16
Registriert: Fr 2. Okt 2009, 10:11
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hessen

Re: Guid-Felder unter FB

Beitrag von MBickel »

knight hat geschrieben:Ich würde mal auf ein Problem mit der Zeichencodierung tippen. Lazarus verwendet standardmäßig UTF8. Wenn in deiner Datenbank eine andere Kodierung verwendet wird, dann kann es zu solchen Anzeigeproblemen kommen. Entweder baust du in dem Fall Konvertierungsroutinen ein oder du änderst die Kodierung in der Datenbank.

knight
... auch mit UTF8 in der DB kommen die Zeichen so heraus, ändert sich leider nichts.

Viele Grüße
Michael

MBickel
Beiträge: 16
Registriert: Fr 2. Okt 2009, 10:11
OS, Lazarus, FPC: Winux (L 0.9.xy FPC 2.2.z)
CPU-Target: xxBit
Wohnort: Hessen

Re: Guid-Felder unter FB

Beitrag von MBickel »

knight hat geschrieben:Ich würde mal auf ein Problem mit der Zeichencodierung tippen. Lazarus verwendet standardmäßig UTF8. Wenn in deiner Datenbank eine andere Kodierung verwendet wird, dann kann es zu solchen Anzeigeproblemen kommen. Entweder baust du in dem Fall Konvertierungsroutinen ein oder du änderst die Kodierung in der Datenbank.

knight
soweit ich es verstanden habe, ist es kein Problem eines Zeichensatzes, sondern einfach nur das, was FB halt codiert. Ab 2.5.x gibt es wohl Funktionen (uuid_to_char()), die das Ganze bei Bedarf menschenlesbar machen.

Socke
Lazarusforum e. V.
Beiträge: 3177
Registriert: Di 22. Jul 2008, 19:27
OS, Lazarus, FPC: Lazarus: SVN; FPC: svn; Win 10/Linux/Raspbian/openSUSE
CPU-Target: 32bit x86 armhf
Wohnort: Köln
Kontaktdaten:

Re: Guid-Felder unter FB

Beitrag von Socke »

Ein TGUID ist ein schöner packed record, dessen Größe sich auch mit SizeOf(TGUID) (von Hand auf 20 Byte geschätzt) ermitteln lässt. Du könntest diesen record also auch als blob speichern.
Alternative ist SysUtils:

Code: Alles auswählen

function StringToGUID(const S: string): TGUID;
function GUIDToString(const GUID: TGUID): string;
function IsEqualGUID(const guid1, guid2: TGUID): Boolean;
Das gibts mindestens seit v. 2.4. aber wahrscheinlich schon (viel) früher.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Hitman
Beiträge: 512
Registriert: Mo 25. Aug 2008, 18:17
OS, Lazarus, FPC: ArchLinux x86, WinVista x86-64, Lazarus 0.9.29, FPC 2.4.1
CPU-Target: x86
Wohnort: Chemnitz

Re: Guid-Felder unter FB

Beitrag von Hitman »

Naja wie es kodiert ist, kann ich mir denken: da der ausgegebene "String" genau halb solang ist wie eine GUID, würde ich mal sagen, nutzt das Feld einfach statt einem Byte für einen Char, ein halbes Byte für den Char (also 4 Bit). Das macht auch durchaus Sinn, da du mit 4 Bit gerade 16 Zeichen repräsentieren kannst und mehr braucht eine GUID ohnehin nicht. Somit sollte es also auch relativ simpel zu dekodieren gehen.

Antworten