sql >> Base de Datos >  >> RDS >> Mysql

¿Por qué Delphi (Zeos) me da campos de cadena ancha en SQLite cuando pido un gran int sin firmar?

No, no "vuelve" a la cadena, SQlite solo almacena los datos tal como se proporcionan.

Como indica la documentación :

Si proporcionó/vinculó un valor de texto, almacenaría un valor de texto. No hay conversión al tipo proporcionado en la instrucción CREATE TABLE, ya que puede aparecen en otros RBMS más estrictos, p. MySQL.

Entonces, en su caso, si recupera los datos como ftWideString , supongo que esto se debe a que escribiste los datos como TEXTO. Por ejemplo, la herramienta o el programa que crea el contenido SQLite3 de su MySQL está escribiendo esta columna como TEXTO.

Acerca de los números, no hay "firmado"/"sin firmar", ni verificación de precisión en SQLite3. Entonces, si desea almacenar valores de "int grande sin firmar", simplemente use INTEGER, que son Int64.

Pero, en todos los casos, incluso si SQLite3 API admite enteros de 64 bits SIN FIRMAR , este sqlite3_uint64 type puede difícilmente ser compatible con Zeos/ZDBC API o Delphi (las versiones anteriores de Delphi NO son compatibles con UInt64). Para estar seguro, es mejor que recupere valores como TEXTO y luego conviértalos como UInt64 manualmente en su código Delphi.

Actualizar:

¿Está utilizando el TDataSet? descendiente proporcionado por Zeos? Este componente está vinculado a DB.Pas , por lo que espera un solo tipo por columna. Puede ser la fuente de confusión de su código (que no mostró en absoluto, por lo que es difícil averiguar qué está sucediendo).

Debería usar mejor la interfaz ZDBC de nivel inferior, que permite recuperar el tipo de columna para cada fila y llamar al método de captación de valor según lo necesite.