Hallo allesamt,
Ich habe eine
MySQL-(kompatible)-Datenbank mit folgender Tabelle:
Code:
CREATE TABLE test(
id BINARY(16) PRIMARY KEY,
name VARCHAR(255),
picture BLOB
);
Wie vielleicht zu erwarten, ist die Spalte "id" für eine UUID/
GUID gedacht.
Nun möchte ich Daten in diese einfügen. Aufgrund des geerbten Codes, der stark auf der TDataSet-Klasse aufbaut, muss ich dies über besagte TDataSet-Objekte abfertigen. Folgender Code kam mir da in den Sinn
Delphi-Quellcode:
fConnection := TFDConnection.Create(
nil);
fConnection.Open('
DriverID=MySQL;Host=localhost;Port=3306;Database=test;User_Name=root');
var Q := TFDQuery.Create(
nil);
Q.Connection := fConnection;
Q.Open('
SELECT * FROM test LIMIT 0');
// DataSet für Tabelle "test" holen
Q.Append;
Q.FieldByName('
id').AsBytes := fGUID.ToByteArray;
Q.FieldByName('
name').AsString := fName;
var S := Q.CreateBlobStream(Q.FieldByName('
picture'), bmWrite);
try
S.Size := 0;
fPngPicture.Position := 0;
S.CopyFrom(fPngPicture);
finally
S.Free;
end;
Q.Post;
So wie es da steht, bekomme ich den Fehler, dass das Feld "id" nur Strings der Länge 5 akzeptiert, der gegebene String aber die Länge 6 hat:
[FireDAC][DatS]-32. Überlauf der Spalte[id] mit variabler Länge. Wertlänge - [6], Maximallänge der Spalte - [5]
Ein Blick auf die Datentypen verrät, dass er die Spalte "id" als ftFixedWideChar interpretiert. ftBytes erscheint mir passender.
Definiert man in der Connection noch "CharacterSet=Binary", wird die Spalte als ftFixedChar anerkannt, der Fehler kommt weiterhin, nur mit den Zahlen 16 und 17. Umgeht man diesen Fehler durch Kürzen des Arrays, findet man aber ein viel größeres Problem: "fName" wird nicht in UTF8 konvertiert. Jedenfalls beschwert er sich, dass es sich um keine gültige utf8mb4-Sequenz handelt.
Andererseits kann man auch "CharacterSet=utf8mb4" definieren, ändert nur nix an der Problematik ohne den Parameter.
Nun zur Frage: Wie arbeite ich korrekt mit einem Datenbank-Feld vom Type BINARY/VARBINARY? Entweder er konvertiert mir die Feldgröße weg (16 -> 5) oder er hängt (scheinbar) einen Null-Character an meine Daten und beschwert sich dann, dass die zu lang sind.
Ein weiteres Problem, was ich jetzt nicht mehr nachstellen kann ist, dass er beim definieren von "CharacterSet=utf8mb4" auch den PNG-Stream "konvertiert" hat. Da kam ganz schön viel chinesisch raus.
Zwei Tage googlen haben keine Früchte getragen, scheinbar hat niemand sonst das Problem