sqlite - 当 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]); });
});
解决方案
问题出在您的表定义中。您的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
推荐阅读
- swift - 想要在同一集合视图单元格中快速加载按钮和图像
- c# - 无法在 .NET 5 和 Visual Studio Code 中引用 Entity Framework Core
- .net - 什么是应用程序主页、应用程序隐私政策链接、Oauth 同意屏幕中的应用程序服务条款链接
- machine-learning - ValueError: X 有 1 个特征,但 DecisionTreeRegressor 期望 62 个特征作为输入
- javascript - JsPDf html2canvas html to image to pdf 拆分页面
- testing - 如何在测试中切换到不同的 Testinfra 主机?
- phpspreadsheet - PhpSpreadsheet 清除现有单元格或范围内容
- java - 使用本地 SQLite 数据库和 NFC 写入/读取选项实现 Android 应用程序是否可行?
- c++ - 带有嵌套类的 C++ 抽象类
- python - 如何使用 Python 解析字符串中的转义字符