ich habe hier eine MariaDB-Datenbank der Version 10.0.32 mit folgender Tabelle und Inhalt:
Code: Alles auswählen
CREATE TABLE t (
f BIT(1)
);
INSERT INTO t VALUES(0),(1);
Code: Alles auswählen
SELECT f FROM t
Das sonderbare ist: Unter Windows erhalte ich das korrekte Ergebnis (0),(1) und unter Linux ein falsches Ergebnis (0),(0).
Was ist da los?
Meine Umgebung ist:
Windows 10 64bit; Anwendung aber in 32 Bit
- Lazarus rev. 56257
- FPC 3.1.1 rev. 37316
- MariaDB C-Connector 3.0.2 (kompatibel zu MySQL 5.6)
- Lazarus 1.8.0
- FPC 3.0.4
- libmariadb2 Version 2.3.2-2 (kompatibel zu MySQL 5.5) und libmariadbclient18 Version 10.1.26-0+deb9u1 (Kompatibel zu MySQL 5.6)
Auf beiden Plattformen habe ich Clients, die das Ergebnis korrekt anzeigen (HeidiSQL unter Windows und MySQL Workbench unter Linux).
Interessant ist, dass ich mit dem Kommandozeilen-Tool mysql die Abfrage ändern muss, damit Klartext ausgegeben wird:
Code: Alles auswählen
SELECT cast(f AS int) FROM t
Wenn ich In Lazarus ein die entsprechenden Komponenten platziere und die Felddefinitionen der SQL-Query automatisch erstelle, werden auf beiden Systemen die Eigenschaften identisch gesetzt (DataType=ftLargeint, Precision=-1). Übernehme ich den CAST(f as INT) in die Query in Lazarus ändert das unter Linux gar nichts; Windows verhält sich dann wie Linux.
Edit:
Obwohl das Verhalten höchst seltsam ist, habe ich eine Lösung gefunden. Der offizielle Datentyp für boolsche Werte in MariaDB ist TINYINT(1). Damit funktioniert meine Anwendung ungeändert unter Windows wie Linux. Falls dennoch jemand weitere Erkenntnisse hat, würde ich diese trotzdem gerne kennen.