1. sqlite數據類型有哪些
SQLite 數據類型是一個用來指定任何對象的數據類型的屬性。SQLite 中的每一列,每個變數和表達式都有相關的數據類型。
您可以在創建表的同時使用這些數據類型。SQLite 使用一個更普遍的動態類型系統。在 SQLite 中,值的數據類型與值本身是相關的,而不是與它的容器相關。
SQLite 存儲類
每個存儲在 SQLite 資料庫中的值都具有以下存儲類之一:
存儲類
描述
NULL 值是一個 NULL 值。
INTEGER 值是一個帶符號的整數,根據值的大小存儲在 1、2、3、4、6 或 8 位元組中。
REAL 值是一個浮點值,存儲為 8 位元組的 IEEE 浮點數字。
TEXT 值是一個文本字元串,使用資料庫編碼(UTF-8、UTF-16BE 或 UTF-16LE)存儲。
BLOB 值是一個 blob 數據,完全根據它的輸入存儲。
SQLite 的存儲類稍微比數據類型更普遍。INTEGER 存儲類,例如,包含 6 種不同的不同長度的整數數據類型。
SQLite 親和(Affinity)類型
SQLite支持列的親和類型概念。任何列仍然可以存儲任何類型的數據,當數據插入時,該欄位的數據將會優先採用親緣類型作為該值的存儲方式。SQLite目前的版本支持以下五種親緣類型:
親和類型
描述
TEXT 數值型數據在被插入之前,需要先被轉換為文本格式,之後再插入到目標欄位手局中。
NUMERIC 當文本數據被插入到親緣性為NUMERIC的欄位中時,如果轉換操作不會導致數據信息丟失以及完全可逆,那麼SQLite就會將該文本數據轉換為INTEGER或REAL類型的數據,如果轉換失敗,SQLite仍會以TEXT方式存儲該數據。對於NULL或BLOB類型的新數據,SQLite將不做任何轉換,直接以NULL或BLOB的方式存儲該數據。需要額外說明的是,對於浮點格式的常量文本,如"30000.0",如果該值可以轉換為INTEGER同時又不會丟失數值信息,那麼SQLite就會將其轉換為INTEGER的存儲方式。
INTEGER 對於親緣類型為INTEGER的欄位,其規則等同於NUMERIC,唯一差別是在執大蠢行CAST表達式時。
REAL 其規則基本等同於NUMERIC,唯一的差別是不會將"30000.0"這樣的文本數畢仿讓據轉換為INTEGER存儲方式。
NONE 不做任何的轉換,直接以該數據所屬的數據類型進行存儲。
SQLite 親和類型(Affinity)及類型名稱
下表列出了當創建 SQLite3 表時可使用的各種數據類型名稱,同時也顯示了相應的親和類型:
數據類型
親和類型
INT
INTEGER
TINYINT
SMALLINT
MEDIUMINT
BIGINT
UNSIGNED BIG INT
INT2
INT8
INTEGER
CHARACTER(20)
VARCHAR(255)
VARYING CHARACTER(255)
NCHAR(55)
NATIVE CHARACTER(70)
NVARCHAR(100)
TEXT
CLOB
TEXT
BLOB
no datatype specified
NONE
REAL
DOUBLE
DOUBLE PRECISION
FLOAT
REAL
NUMERIC
DECIMAL(10,5)
BOOLEAN
DATE
DATETIME
NUMERIC
2. sqlite3 欄位數據類型怎麼看
Sqlite v3資料庫中的任何列,除了整形主鍵列,可以用於存儲任何一個存儲列的值。sql語句中的中所有值,不管它們是嵌入在sql文本中或者是作為參數綁定到一個預編譯的sql語句,它們的存儲類型都是未定的。在下面描述的情況中,資料庫引擎會在查詢執行過程中在數值(numeric)存儲類型(INTEGER和REAL)和TEXT之間轉換值。
1.1布爾類型
Sqlite沒有單獨的布爾存儲類型,它使用INTEGER作局襪衡為存儲類型,好搭0為false,1為true
1.2 Date和Time Datatype
Sqlite沒有另外為存儲日期和時間設定一個存儲類集,內置的sqlite日期和時間函數能夠將日期和時間以TEXT,REAL或INTEGER形式存放
l TEXT 作為IS08601字元串("YYYY-MM-DD HH:MM:SS.SSS")
l REAL 從格林威治時間11月24日,4174 B.C中午以來的天數
l INTEGER 從 1970-01-01 00:00:00 UTC以來的秒數
程序可以任意選擇這幾個存儲類型去存儲日期和時間,並且能夠使用內置的日期和時間函數在這些格式間自由轉桐做換
3. 如何使用SQLite
SQLite3是目前最新的SQLite版本。可以從網站上下載SQLite3的源代碼(本書使用的版本是sqlite-3.6.12.tar.gz)。
解壓縮後進入sqlite-3.6.12的根目錄,首先命令「./configure」生成Makefile文件,接著運行命令「make」對源代碼進行編譯,最後運行命令「make install」安裝SQLite3。安裝完畢後,可以運行命令sqlite3查看SQLite3是否能正常運行,如下所示:
[root@localhost ~]# sqlite3
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite>
可以看到,SQLite3啟動後會停留在提示符sqlite>處,等待用戶輸入SQL語句。
在使用SQLite3前需要先了解下SQLite3支持的數據類型。SQLite3支持的基本數據類型主要有以下幾類:
NULL
NUMERIC
INTEGER
REAL
TEXT
SQLite3會自動把其他數據類型轉換成以上5類基本數據類型,轉換規則如下所示:
char、clob、test、varchar—> TEXT
integer—>INTEGER
real、double、float—> REAL
blob—>NULL
其餘數據類型都轉變成NUMERIC
下面通過一個實例來演示SQLite3的使用方法。
新建一個資料庫
新建資料庫test.db(使用.db後綴是為了標識資料庫文件)。在test.db中新建一個表test_table,該表具有name,、sex、age三列。SQLite3的具體操作如下所示:
[root@localhost home]# sqlite3 test.db
SQLite version 3.6.12
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> create table test_table(name, sex, age);
如果資料庫test.db已經存在,則命令「sqlite3 test.db」會在當前目錄下打開test.db。如果資料庫test.db不存在,則命令「sqlite3 test.db」會在當前目錄下新建資料庫test.db。為了提高效率,SQLite3並不會馬上創建test.db,而是等到第一個表創建完成後才會在物理上創建資料庫。
由於SQLite3能根據插入數據的實際類型動態改變列的類型,所以在create語句中並不要求給出列的類型。
創建索引
為了加快表的查詢速度,往往在主鍵上添加索引。如下所示的是在name列上添加索引的過程。
sqlite> create index test_index on test_table(name);
操作數據
如下所示的是在test_table中進行數據的插入、更新、刪除操作:
sqlite> insert into test_table values ('xiaoming', 'male', 20);
sqlite> insert into test_table values ('xiaohong', 'female', 18);
sqlite> select * from test_table;
xiaoming|male|20
xiaohong|female|18
sqlite> update test_table set age=19 where name = 'xiaohong';
sqlite> select * from test_table;
xiaoming|male|20
xiaohong|female|19
sqlite> delete from test_table where name = 'xiaoming';
sqlite> select * from test_table;
xiaohong|female|19
批量操作資料庫
如下所示的是在test_table中連續插入兩條記錄:
sqlite> begin;
sqlite> insert into test_table values ('xiaoxue', 'female', 18);
sqlite> insert into test_table values ('xiaoliu', 'male', 20);
sqlite> commit;
sqlite> select * from test_table;
xiaohong|female|19
xiaoxue|male|18
xiaoliu|male|20
運行命令commit後,才會把插入的數據寫入資料庫中。
資料庫的導入導出
如下所示的是把test.db導出到sql文件中:
[root@localhost home]# sqlite3 test.db ".mp" > test.sql;
test.sql文件的內容如下所示:
BEGIN TRANSACTION;
CREATE TABLE test_table(name, sex, age);
INSERT INTO "test_table" VALUES('xiaohong','female',19);
CREATE INDEX test_index on test_table(name);
COMMIT;
如下所示的是導入test.sql文件(導入前刪除原有的test.db):
[root@localhost home]# sqlite3 test.db < test.sql;
通過對test.sql文件的導入導出,可以實現資料庫文件的備份。
11.2.2 SQLite3的C介面
以上介紹的是SQLite3資料庫的命令操作方式。在實際使用中,一般都是應用程序需要對資料庫進行訪問。為此,SQLite3提供了各種編程語言的使用介面(本書介紹C語言介面)。SQLite3具有幾十個C介面,下面介紹一些常用的C介面。
sqlite_open
作用:打開SQLite3資料庫
原型:int sqlite3_open(const char *dbname, sqlite3 **db)
參數:
dbname:資料庫的名稱;
db:資料庫的句柄;
sqlite_colse
作用:關閉SQLite3資料庫
原型:int sqlite_close(sqlite3 *db)
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
int main()
{
int rc;
rc= sqlite3_open("test.db", &db);
if(rc)
{
printf("can't open database!\n");
}
else
{
printf("open database success!\n");
}
sqlite3_close(db);
return 0;
}
運行命令「gcc –o test test.c –lsqlite3」進行編譯,運行test的結果如下所示:
[root@localhost home]# open database success!
sqlite_exec
作用:執行SQL語句
原型:int sqlite3_exec(sqlite3 *db, const char *sql, int (*callback)(void*,int,char**,char**), void *, char **errmsg)
參數:
db:資料庫;
sql:SQL語句;
callback:回滾;
errmsg:錯誤信息
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static char *errmsg=NULL;
int main()
{
int rc;
rc = sqlite3_open("test.db", &db);
rc = sqlite3_exec(db,"insert into test_table values('bao', 'male', 24)", 0, 0, &errmsg);
if(rc)
{
printf("exec fail!\n");
}
else
{
printf("exec success!\n");
}
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
exec success!
[root@localhost home]# sqlite3 test.db
SQLite version 3.6.11
Enter ".help" for instructions
Enter SQL statements terminated with a ";"
sqlite> select * from test_table;
bao|male|24
sqlite3_get_table
作用:執行SQL查詢
原型:int sqlite3_get_table(sqlite3 *db, const char *zSql, char ***pazResult, int *pnRow, int *pnColumn, char **pzErrmsg)
參數:
db:資料庫;
zSql:SQL語句;
pazResult:查詢結果集;
pnRow:結果集的行數;
pnColumn:結果集的列數;
errmsg:錯誤信息;
sqlite3_free_table
作用:注銷結果集
原型:void sqlite3_free_table(char **result)
參數:
result:結果集;
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static char **Result=NULL;
static char *errmsg=NULL;
int main()
{
int rc, i, j;
int nrow;
int ncolumn;
rc= sqlite3_open("test.db", &db);
rc= sqlite3_get_table(db, "select * from test_table", &Result, &nrow, &ncolumn,
&errmsg);
if(rc)
{
printf("query fail!\n");
}
else
{
printf("query success!\n");
for(i = 1; i <= nrow; i++)
{
for(j = 0; j < ncolumn; j++)
{
printf("%s | ", Result[i * ncolumn + j]);
}
printf("\n");
}
}
sqlite3_free_table(Result);
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
query success!
xiaohong | female | 19 |
xiaoxue | female | 18 |
xiaoliu | male | 20 |
bao | male | 24 |
sqlite3_prepare
作用:把SQL語句編譯成位元組碼,由後面的執行函數去執行
原型:int sqlite3_prepare(sqlite3 *db, const char *zSql, int nByte, sqlite3_stmt **stmt, const char **pTail)
參數:
db:資料庫;
zSql:SQL語句;
nByte:SQL語句的最大位元組數;
stmt:Statement句柄;
pTail:SQL語句無用部分的指針;
sqlite3_step
作用:步步執行SQL語句位元組碼
原型:int sqlite3_step (sqlite3_stmt *)
例如:
test.c:
#include <stdio.h>
#include <sqlite3.h>
static sqlite3 *db=NULL;
static sqlite3_stmt *stmt=NULL;
int main()
{
int rc, i, j;
int ncolumn;
rc= sqlite3_open("test.db", &db);
rc=sqlite3_prepare(db,"select * from test_table",-1,&stmt,0);
if(rc)
{
printf("query fail!\n");
}
else
{
printf("query success!\n");
rc=sqlite3_step(stmt);
ncolumn=sqlite3_column_count(stmt);
while(rc==SQLITE_ROW)
{
for(i=0; i<2; i++)
{
printf("%s | ", sqlite3_column_text(stmt,i));
}
printf("\n");
rc=sqlite3_step(stmt);
}
}
sqlite3_finalize(stmt);
sqlite3_close(db);
return 0;
}
編譯完成後,運行test的結果如下所示:
[root@localhost home]# ./test
query success!
xiaohong | female | 19 |
xiaoxue | female | 18 |
xiaoliu | male | 20 |
bao | male | 24 |
在程序中訪問SQLite3資料庫時,要注意C API的介面定義和數據類型是否正確,否則會得到錯誤的訪問結果。
4. sqlite中如何存儲GUID類型的數據
SQLite實際上只有5種數據類型,NULL,INTEGER,REAL,TEXT,BLOB,GUID實際上就是BLOB,也就是二進制,用二進制的方式納吵跡來保存的,只量SQLite
Expert通過判斷是GUID類型顯示成了GUID的格式。GUID的二進制格式也是有講究的,否則直接ToString()也得不洞並到正確的碰橡二進制格式。
5. 在SQLite中存儲日期和時間應選擇什麼數據類型
SQLite的數據分為NULL、BLOB、INTEGER、REAL、TEXT五種類型,存敬慶祥亮搏儲日期和時間差棚的欄位 s可以使用數字或者文本
6. sqlite3 數據類型問題
兩者在空間上有很大區別
首先 varchar 是一個空間可變的類型.比如 varchar(20),那麼表示這個欄位最多能存儲20個字元,但是當裡面只存 一個字元的時候,這個欄位占的空間就是1,空間是跟著存入的字元的多碧慧少而變的.
而 text 用來存儲大量的非統一編悔念答碼型字元數據,空間大小不限制.但是在查詢的時候 速度會受到限制.
比如一個新聞表,一般可以將 標題設置為 varchar,內容可以設置為 text 這樣才能有效高局的提高系統的效率.
7. sqlite 可以存放json數據嗎
sqlite 可以存放json數據
sqlite資料庫中不支持布爾型。
SQLite將數據值的存儲劃分為以下幾種存儲類型:
NULL: 表示該稿祥值為NULL值。
INTEGER: 無符號整型值。
REAL: 浮點值。
TEXT: 文本字元串,存儲使用的編碼方式為UTF-8、UTF-16BE、UTF-16LE。
BLOB: 存儲Blob數據,該類型數據和輸入數據完全相同。
由於SQLite採用的是動態數據類型,而其他傳統的關系型資料庫使用的是靜態數據類型,即欄位可以存儲的數據類型是在表聲明時即以確定的,因此它們之間在數據存儲方面還是存在著很大的差異。在SQLite中,存殲敬沒儲分類和數據類型也有一定的差別,如INTEGER存儲氏納類別可以包含6種不同長度的Integer數據類型,然而這些INTEGER數據一旦被讀入到內存後,SQLite會將其全部視為佔用8個位元組無符號整型。因此對於SQLite而言,即使在表聲明中明確了欄位類型,我們仍然可以在該欄位中存儲其它類型的數據。然而需要特別說明的是,盡管SQLite為我們提供了這種方便,但是一旦考慮到資料庫平台的可移植性問題,我們在實際的開發中還是應該盡可能的保證數據類型的存儲和聲明的一致性。除非你有極為充分的理由,同時又不再考慮資料庫平台的移植問題,在此種情況下確實可以使用SQLite提供的此種特徵。
8. 請問Sqlite 中 string和text 兩種數據類型有什麼區別
string是字元串,你向這個類型的數據位置寫字元串的時候,傳遞的是什液昌么字元串類型,它就以什麼字元串類型保持。
text你可以理解為在庫里建了個txt文檔,向這個文檔里寫文字,它會以這個數據類型所設置的編碼進行存拍如儲。
假設鬧賀扒sqlite庫中,A1是string,B1是text。我用VB向A1中寫「abc」,向B1中寫「abc」,那麼a1中實際放的是Unicode格式的「abc」(VB默認的字元串格式為Unicode),而B1中放的是UTF-8格式的「abc」