Mysql
 sql >> Base de données >  >> RDS >> Mysql

Pourquoi Delphi (Zeos) me donne-t-il des champs à chaîne large dans SQLite lorsque je demande un grand int non signé?

Non, il ne "revient" pas à la chaîne, SQlite stocke simplement les données telles qu'elles sont fournies.

Comme la documentation l'indique :

Si vous avez fourni/lié une valeur de texte, il stockerait une valeur de texte. Il n'y a pas de conversion vers le type fourni dans l'instruction CREATE TABLE, car cela peut apparaissent dans d'autres RBMS plus stricts, par ex. MySQL.

Donc, dans votre cas, si vous récupérez les données en tant que ftWideString , je suppose que c'est parce que vous avez écrit les données en tant que TEXT. Par exemple, l'outil ou le programme créant le contenu SQLite3 à partir de votre MySQL écrit cette colonne sous la forme TEXT.

A propos des nombres, il n'y a pas de "signé"/"non signé", ni de contrôle de précision dans SQLite3. Donc, si vous souhaitez stocker des valeurs "unsigned big int", utilisez simplement INTEGER, qui sont Int64.

Mais, dans tous les cas, même si l'API SQLite3 prend en charge les entiers 64 bits NON SIGNÉS , ce sqlite3_uint64 type peut difficilement être pris en charge par l'API Zeos/ZDBC ou par Delphi (les anciennes versions de Delphi ne prennent PAS en charge UInt64). Pour être sûr, vous devriez mieux récupérer des valeurs telles que TEXT, puis les convertir en UInt64 manuellement dans votre code Delphi.

Mettre à jour :

Utilisez-vous le TDataSet descendant fourni par Zeos? Ce composant est lié à DB.Pas , attend donc un seul type par colonne. Cela peut être la source de confusion de votre code (que vous n'avez pas du tout montré, il est donc difficile de comprendre ce qui se passe).

Vous devriez mieux utiliser l'interface ZDBC de niveau inférieur, qui permet de récupérer le type de colonne pour chaque ligne, et d'appeler la méthode de récupération de valeur selon vos besoins.