[Erledigt] SQLDB und Datentyp Bit

Für Themen zu Datenbanken und Zugriff auf diese. Auch für Datenbankkomponenten.
Antworten
Socke
Lazarusforum e. V.
Beiträge: 3158
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:

[Erledigt] SQLDB und Datentyp Bit

Beitrag von Socke »

Hallo zusammen,

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);

Die SQL-Abfrage ist:

Code: Alles auswählen

SELECT f FROM t

Die Abfrage wird mit SQLDB ausgeführt. Ein Wechsel auf ZEOS ist akutell ausgeschlossen.
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)

Debian 9.3, 32 Bit
  • 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)
Unter Linux spielt es keine Rolle, welche Bibliothek ich verwende.

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

Andernfalls wird offenbar das Bitfeld einfach als Zeichen ausgegeben, wodurch die Schriftart ein Ersatzzeichen für die Binär-1 und 0 gar nicht anzeigt. Unter Windows habe ich leider keinen Kommandozeilen-mysql.

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.
MfG Socke
Ein Gedicht braucht keinen Reim//Ich pack’ hier trotzdem einen rein

Antworten