欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

php SQLite學習筆記與常見問題分析第1/2頁

 更新時間:2008年07月23日 19:22:44   作者:  
php SQLite學習資料收集,與一些常見問題的解決方法
直到學會! 學之前找資料
SQLite的sql
ATTACH DATABASE
BEGIN TRANSACTION
comment
COMMIT TRANSACTION
COPY
CREATE INDEX
CREATE TABLE
CREATE TRIGGER
CREATE VIEW
DELETE
DETACH DATABASE
DROP INDEX
DROP TABLE
DROP TRIGGER
DROP VIEW
END TRANSACTION
EXPLAIN
expression
INSERT
ON CONFLICT clause
PRAGMA
REPLACE
ROLLBACK TRANSACTION
SELECT
UPDATE


sqlite常見問題
 (1) 如何建立自動增長字段?

簡短回答:聲明為 INTEGER PRIMARY KEY 的列將會自動增長。

長一點的答案: 如果你聲明表的一列為 INTEGER PRIMARY KEY,那么, 每當你在該列上插入一NULL值時, NULL自動被轉換為一個比該列中最大值大1的一個整數(shù),如果表是空的, 將會是1。 (如果是最大可能的主鍵 9223372036854775807,那個,將鍵值將是隨機未使用的數(shù)。) 如,有下列表:

CREATE TABLE t1(
  a INTEGER PRIMARY KEY,
  b INTEGER
);

在該表上,下列語句

INSERT INTO t1 VALUES(NULL,123);

在邏輯上等價于:

INSERT INTO t1 VALUES((SELECT max(a) FROM t1)+1,123);

有一個新的API叫做 sqlite3_last_insert_rowid(), 它將返回最近插入的整數(shù)值。

注意該整數(shù)會比表中該列上的插入之前的最大值大1。該鍵值在當前的表中是唯一的。但有可能與已從表中刪除的值重疊。要想建立在整個表的生命周期中唯一的鍵值,需要在 INTEGER PRIMARY KEY 上增加AUTOINCREMENT聲明。那么,新的鍵值將會比該表中曾能存在過的最大值大1。如果最大可能的整數(shù)值在數(shù)據(jù)表中曾經(jīng)存在過,INSERT將會失敗, 并返回SQLITE_FULL錯誤代碼。


--------------------------------------------------------------------------------

(2)SQLite3支持何種數(shù)據(jù)類型?

NULL
INTEGER
REAL
TEXT
BLOB
但實際上,sqlite3也接受如下的數(shù)據(jù)類型:
smallint  16 位元的整數(shù)。
interger  32 位元的整數(shù)。
decimal(p,s)  p 精確值和 s 大小的十進位整數(shù),精確值p是指全部有幾個數(shù)(digits)大小值    ,s是指小數(shù)點後有幾位數(shù)。如果沒有特別指定,則系統(tǒng)會設為 p=5; s=0 。
float   32位元的實數(shù)。
double   64位元的實數(shù)。
char(n)   n 長度的字串,n不能超過 254。
varchar(n)  長度不固定且其最大長度為 n 的字串,n不能超過 4000。
graphic(n)  和 char(n) 一樣,不過其單位是兩個字元 double-bytes, n不能超過127。   這個形態(tài)是為了支援兩個字元長度的字體,例如中文字。
vargraphic(n)  可變長度且其最大長度為 n 的雙字元字串,n不能超過 2000。
date   包含了 年份、月份、日期。
time   包含了 小時、分鐘、秒。
timestamp  包含了 年、月、日、時、分、秒、千分之一秒。

參見 http://www.sqlite.org/datatype3.html.
--------------------------------------------------------------------------------

(3)SQLite允許向一個integer型字段中插入字符串!

這是一個特性,而不是一個bug。SQLite不強制數(shù)據(jù)類型約束。任何數(shù)據(jù)都可以插入任何列。你可以向一個整型列中插入任意長度的字符串,向布爾型列中插入浮點數(shù),或者向字符型列中插入日期型值。 在 CREATE TABLE 中所指定的數(shù)據(jù)類型不會限制在該列中插入任何數(shù)據(jù)。任何列均可接受任意長度的字符串(只有一種情況除外: 標志為INTEGER PRIMARY KEY的列只能存儲64位整數(shù),當向這種列中插數(shù)據(jù)除整數(shù)以外的數(shù)據(jù)時,將會產(chǎn)生錯誤。

但SQLite確實使用聲明的列類型來指示你所期望的格式。所以,例如你向一個整型列中插入字符串時,SQLite會試圖將該字符串轉換成一個整數(shù)。如果可以轉換,它將插入該整數(shù);否則,將插入字符串。這種特性有時被稱為 類型或列親和性(type or column affinity).


--------------------------------------------------------------------------------

(4)為什么SQLite不允許在同一個表不同的兩行上使用0和0.0作主鍵?

主鍵必須是數(shù)值類型,將主鍵改為TEXT型將不起作用。

每一行必須有一個唯一的主鍵。對于一個數(shù)值型列, SQLite認為 '0' 和 '0.0' 是相同的, 因為他們在作為整數(shù)比較時是相等的(參見上一問題)。 所以,這樣值就不唯一了。


--------------------------------------------------------------------------------

(5)多個應用程序或一個應用程序的多個實例可以同時訪問同一個數(shù)據(jù)庫文件嗎?

多個進程可同時打開同一個數(shù)據(jù)庫。多個進程可以同時進行SELECT 操作,但在任一時刻,只能有一個進程對數(shù)據(jù)庫進行更改。

SQLite 使用讀、寫鎖控制對數(shù)據(jù)庫的訪問。(在Win95/98/ME等不支持讀、寫鎖的系統(tǒng)下,使用一個概率性的模擬來代替。)但使用時要注意:如果數(shù)據(jù)庫文件存放于一個NFS文件系統(tǒng)上,這種鎖機制可能不能正常工作。 這是因為 fcntl() 文件鎖在很多NFS上沒有正確的實現(xiàn)。在可能有多個進程同時訪問數(shù)據(jù)庫的時候,應該避免將數(shù)據(jù)庫文件放到NFS上。在Windows上,Microsoft的文檔中說:如果使用 FAT 文件系統(tǒng)而沒有運行 share.exe 守護進程,那么鎖可能是不能正常使用的。那些在Windows上有很多經(jīng)驗的人告訴我:對于網(wǎng)絡文件,文件鎖的實現(xiàn)有好多Bug,是靠不住的。如果他們說的是對的,那么在兩臺或多臺Windows機器間共享數(shù)據(jù)庫可能會引起不期望的問題。

我們意識到,沒有其它嵌入式的 SQL 數(shù)據(jù)庫引擎能象 SQLite 這樣處理如此多的并發(fā)。SQLite允許多個進程同時打開一個數(shù)據(jù)庫,同時讀一個數(shù)據(jù)庫。當有任何進程想要寫時,它必須在更新過程中鎖住數(shù)據(jù)庫文件。但那通常只是幾毫秒的時間。其它進程只需等待寫進程干完活結束。典型地,其它嵌入式的SQL數(shù)據(jù)庫引擎同時只允許一個進程連接到數(shù)據(jù)庫。

但是,Client/Server數(shù)據(jù)庫引擎(如 PostgreSQL, MySQL, 或 Oracle)通常支持更高級別的并發(fā),并且允許多個進程同時寫同一個數(shù)據(jù)庫。這種機制在Client/Server結構的數(shù)據(jù)庫上是可能的,因為總是有一個單一的服務器進程很好地控制、協(xié)調對數(shù)據(jù)庫的訪問。如果你的應用程序需要很多的并發(fā),那么你應該考慮使用一個Client/Server 結構的數(shù)據(jù)庫。但經(jīng)驗表明,很多應用程序需要的并發(fā),往往比其設計者所想象的少得多。

當SQLite試圖訪問一個被其它進程鎖住的文件時,缺省的行為是返回 SQLITE_BUSY。 可以在C代碼中使用 sqlite3_busy_handler() 或 sqlite3_busy_timeout() API 函數(shù)調整這一行為。
---------------------------------------------------------------------------

相關文章

  • php中文驗證碼實現(xiàn)方法

    php中文驗證碼實現(xiàn)方法

    這篇文章主要介紹了php中文驗證碼實現(xiàn)方法,涉及php中文字體及字符串操作的相關技巧,需要的朋友可以參考下
    2015-06-06
  • php dirname(__FILE__) 獲取當前文件的絕對路徑

    php dirname(__FILE__) 獲取當前文件的絕對路徑

    dirname(__FILE__) 取到的是當前文件的絕對路徑,也就是說,比起相對路徑,查找速度是最快的。
    2011-06-06
  • PHP $_FILES中error返回值詳解

    PHP $_FILES中error返回值詳解

    用PHP上傳文件時,我們會用程序去監(jiān)聽瀏覽器發(fā)送過來的文件信息,首先會通 過$_FILES[fieldName]['error']的不同數(shù)值來判斷此欲上傳的文件狀態(tài)是否正常。$_FILES[fieldName] ['error']==0代表一切正常,其它數(shù)值的具體含義請參考下面一段程序的注釋部分,如有翻譯不到之處還望指正
    2014-01-01
  • PHP垃圾回收機制引用計數(shù)器概念分析

    PHP垃圾回收機制引用計數(shù)器概念分析

    php變量存在一個叫"zval"的變量容器中,"zval"變量容器包括含變量的類型和值,還包括額外的兩個字節(jié)信息,分別是“is_ref”表示變量是否屬于引用,“refcount”指向這個zval變量容器的變量個數(shù)
    2013-06-06
  • PHP開發(fā)注意事項總結

    PHP開發(fā)注意事項總結

    這篇文章主要介紹了PHP開發(fā)注意事項總結,非常詳細,需要的朋友可以參考下
    2015-02-02
  • 關于php程序報date()警告的處理(date_default_timezone_set)

    關于php程序報date()警告的處理(date_default_timezone_set)

    PHP Warning: date(): It is not safe to rely on the system's timezone settings. You are *required* to use the date.timezone setting or the date_default_timezone_set() function
    2013-10-10
  • PHP8新特性之JIT案例講解

    PHP8新特性之JIT案例講解

    這篇文章主要介紹了PHP8新特性之JIT案例講解,本篇文章通過簡要的案例,講解了該項技術的了解與使用,以下就是詳細內容,需要的朋友可以參考下
    2021-09-09
  • PHP實現(xiàn)的mongoDB數(shù)據(jù)庫操作類完整實例

    PHP實現(xiàn)的mongoDB數(shù)據(jù)庫操作類完整實例

    這篇文章主要介紹了PHP實現(xiàn)的mongoDB數(shù)據(jù)庫操作類,結合完整實例形式詳細分析了php基于單例模式針對mongoDB數(shù)據(jù)庫連接、增刪改查、統(tǒng)計等操作相關實現(xiàn)技巧,需要的朋友可以參考下
    2018-04-04
  • Joomla下利用configuration.php存儲簡單數(shù)據(jù)

    Joomla下利用configuration.php存儲簡單數(shù)據(jù)

    Joomla下利用configuration.php存儲簡單數(shù)據(jù)的代碼,需要的朋友可以參考下。
    2010-05-05
  • PHP實現(xiàn)的分解質因數(shù)操作示例

    PHP實現(xiàn)的分解質因數(shù)操作示例

    這篇文章主要介紹了PHP實現(xiàn)的分解質因數(shù)操作,結合實例形式分析了php實現(xiàn)分解質因數(shù)的相關原理、步驟與操作技巧,需要的朋友可以參考下
    2018-08-08

最新評論