Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Warum gibt mir Delphi (Zeos) Widestring-Felder in SQLite, wenn ich nach unsigned big int frage?

Nein, es wird nicht auf Zeichenfolgen "zurückgesetzt", SQLite speichert die Daten nur so, wie sie bereitgestellt werden.

Wie die Dokumentation besagt :

Wenn Sie einen Textwert angeben/binden, würde er einen Textwert speichern. Es findet keine Konvertierung in den Typ statt, der in der CREATE TABLE-Anweisung angegeben wurde, da dies möglicherweise der Fall ist erscheinen in anderen strengeren RBMS, z. MySQL.

Also in Ihrem Fall, wenn Sie die Daten als ftWideString abrufen , ich denke, das liegt daran, dass Sie die Daten als TEXT geschrieben haben. Beispielsweise schreibt das Tool oder Programm, das den SQLite3-Inhalt aus Ihrem MySQL erstellt, diese Spalte als TEXT.

Bei Zahlen gibt es in SQLite3 weder "signed"/"unsigned" noch eine Genauigkeitsprüfung. Wenn Sie also "unsigned big int"-Werte speichern möchten, verwenden Sie einfach INTEGER, die Int64 sind.

Aber in allen Fällen, selbst wenn die SQLite3-API UNSIGNED 64-Bit-Ganzzahlen unterstützt , dieses sqlite3_uint64 type wird möglicherweise kaum von der Zeos/ZDBC-API oder von Delphi unterstützt (ältere Versionen von Delphi unterstützen UInt64 NICHT). Um sicherzugehen, sollten Sie solche Werte besser als TEXT abrufen und dann als UInt64 konvertieren manuell in Ihren Delphi-Code.

Aktualisieren:

Verwenden Sie das TDataSet Nachkomme bereitgestellt von Zeos? Diese Komponente ist an DB.Pas gebunden , erwartet also einen einzelnen Typ pro Spalte. Es kann die Quelle der Verwirrung Ihres Codes sein (den Sie überhaupt nicht gezeigt haben, daher ist es schwer herauszufinden, was passiert).

Sie sollten besser die ZDBC-Schnittstelle auf niedrigerer Ebene verwenden, die es ermöglicht, den Spaltentyp für jede Zeile abzurufen, und die Wert-Getter-Methode nach Bedarf aufrufen.