最近有一些关于SQLite中列类型的灵活性的争论。因此,问题是, SQLite列类型有多灵活?
一个论点是,类型仅限于主要的五种类型,即文本、数字、整数、实数和BLOB,以及正式文档中的命名列类型,即:-
INT, TINYINT, SMALLINT, MEDIUMINT, BIGINT, UNSIGNED BIG INT, INT2, INT8, CHARACTER(20), VARCHAR(255), VARYING CHARACTER(255), NCHAR(55), NATIVE CHARACTER(70), NVARCHAR(100), CLOB,no datatype specified (BLOB), DOUBLE, DOUBLE PRECISION, FLOAT, DECIMAL(10,5), BOOLEAN, DATE & DATETIME.
另一个论点是,列表是一个示例列表,列类型更加灵活,几乎普遍适用5条规则(如下所示)。
3.1。柱亲和度的测定 列的亲和力取决于所声明的列类型,按照所示的顺序确定下列规则: 1)如果声明的类型包含字符串"INT“,则为其分配整数关联。 2)如果列的声明类型包含任何字符串"CHAR“、"CLOB”或" TEXT“,则该列具有文本关联。请注意,类型VARCHAR包含字符串"CHAR“,因此指定了文本关联。 3)如果列的声明类型包含字符串" BLOB“,或者如果没有指定类型,则该列具有关联BLOB。 4)如果列的声明类型包含任何字符串" REAL“、"FLOA”或"DOUB“,则该列具有真正的亲缘关系。 5),否则,关联是数字的。 请注意,确定列亲和力的规则的顺序很重要。声明类型为"CHARINT“的列将匹配规则1和规则2,但第一条规则优先,因此列关联为整数。
那么,列类型的进出/对错是什么?
发布于 2017-08-07 23:55:11
SQLite列类型是灵活的(动态的),主要是为了适应其他数据库管理系统使用的刚性列类型。
笔记!这并不是建议使用奇怪和精彩的列类型.。
1)实际上可以为列类型使用任何名称,但是也有一些限制。
2)列类型是列定义中的第二个值,例如CREATE TABLE table (columnname columntype .....,....),尽管可能有意或无意中省略它--参见5a)
第一个限制是mycolumnINTEGER PRIMARY KEY或mycolumnINTEGER PRIMARY KEY AUTOINCREMENT是一种特殊的列类型。该列是rowid的别名,它是唯一的数字标识符(AUTOINCREMENT强加了一条规则,即 rowid 必须大于表的上一次使用的rowid,例如,如果一行使用id (9223372036854775807),那么以后任何添加行的尝试都会导致SQLITE完全错误。)。SQLite自动增量
4)的其他限制是,列类型不能混淆SQLite解析器。例如,主、表、索引的列类型将导致SQLite异常(语法错误(代码1)),例如当使用列类型的索引时:-
android.database.sqlite.SQLiteException: near "INDEX": syntax error (code 1):发生。
PRAGMA TABLE_INFO(tablename) 5)列类型不是强制性的,例如CREATE TABLE mytable (...,PRIMARY_COL,....,在这种情况下,将不显示类型,例如(第3行)。
08-08 07:56:23.391 13097-13097/? D/TBL_INFO: Col=cid Value=8
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=name Value=PRIMARY_COL
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=type Value=
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=notnull Value=1
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=dflt_value Value=null
08-08 07:56:23.391 13097-13097/? D/ TBLINFO: Col=pk Value=05a)在某些情况下,SQLite解析器将跳过到有效的关键字,例如CREATE TABLE mytable (mycolumn NOT NULL,...结果,NOT NULL被用来表示NOT NULL列,类型被认为是,no类型(实际上,上面的table_info来自这样的用法)。
( VARYING CHARACTER(255)或THE BIG BAD WOLF可指定为一种类型,从本table_info摘录中可以看出:-
08-08 08:23:26.423 4799-4799/? D/ TBLINFO: Col=type Value=THE BIG BAD WOLF在SQLite中使用非标准列类型的原因!
总之,没有的原因,正如最初所述,列类型的灵活性似乎主要是为了满足来自其他数据库管理系统的轻松调整。
列类型本身没有多大影响,因为数据将根据SQLite确定的存储类来存储。除了rowid (请参阅上面的3)之外,任何列都可以保存任何类型的值。
除了存储为Blob的数据(必须使用cursor.getBlob检索,并且不能将cursor.getBlob用于非存储为BLOB的数据(getBlob不会失败,数据存储为文本)之外,您可以使用任何cursor.get????方法检索数据(所有这些方法都不一定有用)。
以下是一些例子:-
对于添加数据long myINT = 556677888;的列(通过ContentValues,例如cv1.put(columnanme,myINT));
然后:-
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=INTEGER_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>556677888<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>5.56677888E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>5.566779E8<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>15104<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.getShort不返回存储的值,getBlob无法获得存储的值。
对于Double myREAL = 213456789.4528791134567890109643534276; :-
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Column=REAL_COL<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>213456789<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>6037<<
08-08 09:19:03.658 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.对于String myTEXT = "The Lazy Quick Brown Fox Jumped Over the Fence or something like that.";
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: Column=TEXT_COL<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>The Lazy Quick Brown Fox Jumped Over the Fence or something like that.<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>0.0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>0<<
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ColTypes: VALUE AS BLOB >>[B@2f9e811e<<下面是一个非常可笑的例子,它使用了my_char_is_not_a_char_but_an_int的列类型,如PRAGMA TABLE_INFO :-
08-08 09:19:03.657 13575-13575/mjt.soqanda D/TBL_INFO: Col=cid Value=7
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=name Value=my_char_is_not_a_char_but_an_int_COL
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=type Value=my_char_is_not_a_char_but_an_int
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=notnull Value=0
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=dflt_value Value=null
08-08 09:19:03.657 13575-13575/mjt.soqanda D/ TBLINFO: Col=pk Value=0结果(按以上“双”格式存储)如下:
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Column=my_char_is_not_a_char_but_an_int_COL<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS INT >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS LONG >>213456789<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS STRING >>2.13457e+08<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS DOUBLE >>2.134567894528791E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS FLOAT >>2.1345678E8<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: VALUE AS SHORT >>6037<<
08-08 09:19:03.659 13575-13575/mjt.soqanda D/ColTypes: Unable to handle with getBlob.以上内容基于以下内容:- SQLite版本3中的数据类型 SQLite自动增量 PRAGMA声明
在运行API22的API22模拟设备上测试/运行了代码,该设备的最小版本为14,目标为26。
https://stackoverflow.com/questions/45557278
复制相似问题