首页 > 解决方案 > 当 sqlite 仅包含数字时,如何让它保留字符串类型?

问题描述

当我使用 nativescript-sqlite 插件创建带有 STRING 字段的表并输入字符串“000123”(仅包含数字的任何字符串),然后从数据库中获取记录时,它返回一个 int(123)并且不坚持字符串类型。这有什么诀窍吗?我附上了用于创建、保存和返回字段的代码......

建表(代码已略)

 var Name = 'users';
 var TableDef = MedID INT, Naam STRING ,Pin STRING';
 db.execSQL("CREATE TABLE IF NOT EXISTS " + Name + 
 "(id INTEGER PRIMARY KEY         AUTOINCREMENT," + TableDef + " )")
 .then(result =>  {...} );         

插入记录

db.execSQL( "INSERT INTO users (MedID,Naam,Pin) VALUES (?, ?,?)",
 [1,'John Doe','000123'] )
 .then(id => {...} );

返回密码

var db_name = "scanapp.db";
new sqlite(db_name).then(db => 
{    
     db.all('select MedID, Naam, Pin from users order by ID ')
    .then (rows => { console.log (rows[0][2]); });
});

标签: sqlitenativescript

解决方案


问题出在您的表定义中。您的Pin列的类型为STRING.

在 Sqlite 中,列类型用于设置该列的关联性并控制在该列中存储值的首选方式。如果您查看基于列类型确定亲和类型的规则,您会看到类型STRING默认为NUMERIC亲和,这意味着:

具有 NUMERIC 关联的列可能包含使用所有五个存储类的值。将文本数据插入 NUMERIC 列时,如果这种转换是无损且可逆的,则文本的存储类将转换为 INTEGER 或 REAL(按优先顺序)。

这里有趣的是无损和可逆位,因为这显然不是由于前导 0 被剥离。我怀疑这是一个错误。

无论如何,解决方法是更改​​表定义以使用具有TEXT相似性的类型,例如TEXT,CHAR等,而不是 current STRING

sqlite> create table foo(bar text, baz string);
sqlite> insert into foo values ('0012', '0012');
sqlite> select bar, typeof(bar), baz, typeof(baz) from foo;
bar         typeof(bar)  baz         typeof(baz)
----------  -----------  ----------  -----------
0012        text         12          integer

推荐阅读