SQLDB erstellt mir automatisch ein Feld vom Typ ftFixedChar mit der falschen Länge? Wie kann ich SQLDB dazu überreden, die korrekte Länge automatisch von der Datenbank zu beziehen. Ich habe nicht vor, die Felddefinitionen von Hand anzulegen. Ein Wechsel auf ZEOS ist ebenfalls ausgeschlossen (kann aber gerne als Referenz für eine ggf. korrekte Ermittlung der Feldlänge angegeben werden).
Aktuell gehe ich von einem Fehler in SQLDB aus, da das Programm HeidiSQL die Abfrageergebnisse korrekt darstellt.
Eingesetzt werden:
- MariaDB Version 10.0.31-MariaDB als Server
- MariaDB Connector C, Version 2.1.0
- TMySQL55Connection von FPC trunk und Lazarus trunk
Die Datenbanktabelle enthält binär gespeicherte GUIDs, die mit der Funktionen UuidToBin bzw. UuidFromBin konvertiert werden. Damit ich die GUIDS direkt in Pascal als Strings verarbeiten kann, habe ich mir eine Funktion PasUuidFromBin gebaut, die geschweifte Klammern hinzufügt.
Code: Alles auswählen
CREATE TABLE `data` (
`ID` BINARY(16) NOT NULL COMMENT 'GUID',
PRIMARY KEY (`ID`)
)
COLLATE='utf8_german2_ci'
ENGINE=InnoDB
;
-- Beispieldatensatz einfügen
INSERT INTO DATA VALUES(UuidToBin(UUID()));
-- Stored procedure um die GUIDs direkt als String auszulesen.
CREATE DEFINER=`user`@`%` FUNCTION `PasUuidFromBin`(
`_bin` BINARY(16)
)
RETURNS char(38) CHARSET ascii
LANGUAGE SQL
DETERMINISTIC
CONTAINS SQL
SQL SECURITY DEFINER
COMMENT 'Retrive Pascal style UUID from binary(16)'
BEGIN
RETURN CONCAT('{', UuidFromBin(_bin), '}');
END;
Die Datenabfrage erfolgt dann mit:
Code: Alles auswählen
SELECT PasUuidFromBin(ID) FROM DATA;
Daraus erzeugt SQLDB wie beschrieben ein Feld ftFixedChar mit der Länge 28 (TField.FSize), was dazu führt, dass nur die ersten 28 Zeichen ausgegeben werden.
Auch ein Cast die Abfrage nach CHAR(38) wird auch nicht die korrekte Länge ermittelt.
Code: Alles auswählen
SELECT CONVERT(PasUuidFromBin(ID), CHAR(38)) FROM DATA;
Weiß hier jemand weiter?
Edit: ich habe den MariaDB-Connector auf Version 3.1.0 aktualisiert und bin auf TMySQL56Connection gewechselt - keine Änderung.