令人惊讶的是,我刚刚意识到SQLiteStatement无法正确绑定一个带左边填充为零的数字。
示例:
SQLiteStatement insertSqlStatement =
db.compileStatement("INSERT INTO table(column) VALUES(?)");
insertSqlStatement.bindString(0, "00012");
insertSqlStatement.executeInsert();
// "12" is inserted, instead of "00012"
这不起作用:
insertSqlStatement.bindString(0, "'00012'");
// "'12'" is inserted
这会导致错误:
db.compileStatement("INSERT INTO table(column) VALUES('?')");
有什么想法吗?
答案 0 :(得分:1)
我认为你的问题,即假设“错误”是0的丢失,是对 SQLite 如何最小化存储数据量的误解。
该数据的存储方式(存储类)受列类型(又名亲和力)的影响。简而言之,如果列没有TEXT或BLOB的类型亲和力,那么它将具有数字类型亲和力并以最小的形式存储数字,从而丢弃数字上无用的0。
如果您需要存储0,那么理想情况下您应该使用类型为TEXT的列,这意味着该列应声明为包含 TEXT , CHAR < strong>或 CLOB 但不包含 INT 或 INTEGER 。
按照: -
<强> 3.1。柱亲和力的测定
根据声明的列类型确定列的亲和力 按照显示的顺序遵循规则:
如果声明的类型包含字符串“INT”,则分配它 INTEGER亲和力。
如果声明的列类型包含任何字符串“CHAR”, “CLOB”或“TEXT”然后该列具有TEXT亲和力。请注意 type VARCHAR包含字符串“CHAR”,因此分配了TEXT 亲和力。
如果列的声明类型包含字符串“BLOB”或如果否 指定了类型,然后该列具有关联BLOB。
如果列的声明类型包含任何字符串“REAL”, “FLOA”或“DOUB”然后该列具有REAL亲和力。
- 醇>
否则,亲和力为NUMERIC。
请注意,确定列关联性的规则的顺序是 重要。声明类型为“CHARINT”的列将与两者匹配 规则1和2,但第一个规则优先,因此列 亲和力将是INTEGER。