# SQLite PRAGMA
SQLite 的 **PRAGMA** 命令是一個特殊的命令,可以用在 SQLite 環境內控制各種環境變量和狀態標志。一個 PRAGMA 值可以被讀取,也可以根據需求進行設置。
## 語法
要查詢當前的 PRAGMA 值,只需要提供該 pragma 的名字:
```
PRAGMA pragma_name;
```
要為 PRAGMA 設置一個新的值,語法如下:
```
PRAGMA pragma_name = value;
```
設置模式,可以是名稱或等值的整數,但返回的值將始終是一個整數。
## auto_vacuum Pragma
**auto_vacuum** Pragma 獲取或設置 auto-vacuum 模式。語法如下:
```
PRAGMA [database.]auto_vacuum;
PRAGMA [database.]auto_vacuum = mode;
```
其中,**mode** 可以是以下任何一種:
| Pragma 值 | 描述 |
| --- | --- |
| 0 或 NONE | 禁用 Auto-vacuum。這是默認模式,意味著數據庫文件尺寸大小不會縮小,除非手動使用 VACUUM 命令。 |
| 1 或 FULL | 啟用 Auto-vacuum,是全自動的。在該模式下,允許數據庫文件隨著數據從數據庫移除而縮小。 |
| 2 或 INCREMENTAL | 啟用 Auto-vacuum,但是必須手動激活。在該模式下,引用數據被維持,免費頁面只放在免費列表中。這些頁面可在任何時候使用 **incremental_vacuum pragma** 進行覆蓋。 |
## cache_size Pragma
**cache_size** Pragma 可獲取或暫時設置在內存中頁面緩存的最大尺寸。語法如下:
```
PRAGMA [database.]cache_size;
PRAGMA [database.]cache_size = pages;
```
**pages** 值表示在緩存中的頁面數。內置頁面緩存的默認大小為 2,000 頁,最小尺寸為 10 頁。
## case_sensitive_like Pragma
**case_sensitive_like** Pragma 控制內置的 LIKE 表達式的大小寫敏感度。默認情況下,該 Pragma 為 false,這意味著,內置的 LIKE 操作符忽略字母的大小寫。語法如下:
```
PRAGMA case_sensitive_like = [true|false];
```
目前沒有辦法查詢該 Pragma 的當前狀態。
## count_changes Pragma
**count_changes** Pragma 獲取或設置數據操作語句的返回值,如 INSERT、UPDATE 和 DELETE。語法如下:
```
PRAGMA count_changes;
PRAGMA count_changes = [true|false];
```
默認情況下,該 Pragma 為 false,這些語句不返回任何東西。如果設置為 true,每個所提到的語句將返回一個單行單列的表,由一個單一的整數值組成,該整數表示操作影響的行。
## database_list Pragma
**database_list** Pragma 將用于列出了所有的數據庫連接。語法如下:
```
PRAGMA database_list;
```
該 Pragma 將返回一個單行三列的表格,每當打開或附加數據庫時,會給出數據庫中的序列號,它的名稱和相關的文件。
## encoding Pragma
**encoding** Pragma 控制字符串如何編碼及存儲在數據庫文件中。語法如下:
```
PRAGMA encoding;
PRAGMA encoding = format;
```
格式值可以是 UTF-8、UTF-16le 或 UTF-16be 之一。
## freelist_count Pragma
**freelist_count** Pragma 返回一個整數,表示當前被標記為免費和可用的數據庫頁數。語法如下:
```
PRAGMA [database.]freelist_count;
```
格式值可以是 UTF-8、UTF-16le 或 UTF-16be 之一。
## index_info Pragma
**index_info** Pragma 返回關于數據庫索引的信息。語法如下:
```
PRAGMA [database.]index_info( index_name );
```
結果集將為每個包含在給出列序列的索引、表格內的列索引、列名稱的列顯示一行。
## index_list Pragma
**index_list** Pragma 列出所有與表相關聯的索引。語法如下:
```
PRAGMA [database.]index_list( table_name );
```
結果集將為每個給出列序列的索引、索引名稱、表示索引是否唯一的標識顯示一行。
## journal_mode Pragma
**journal_mode** Pragma 獲取或設置控制日志文件如何存儲和處理的日志模式。語法如下::
```
PRAGMA journal_mode;
PRAGMA journal_mode = mode;
PRAGMA database.journal_mode;
PRAGMA database.journal_mode = mode;
```
這里支持五種日志模式:
| Pragma 值 | 描述 |
| --- | --- |
| DELETE | 默認模式。在該模式下,在事務結束時,日志文件將被刪除。 |
| TRUNCATE | 日志文件被階段為零字節長度。 |
| PERSIST | 日志文件被留在原地,但頭部被重寫,表明日志不再有效。 |
| MEMORY | 日志記錄保留在內存中,而不是磁盤上。 |
| OFF | 不保留任何日志記錄。 |
## max_page_count Pragma
**max_page_count** Pragma 為數據庫獲取或設置允許的最大頁數。語法如下:
```
PRAGMA [database.]max_page_count;
PRAGMA [database.]max_page_count = max_page;
```
默認值是 1,073,741,823,這是一個千兆的頁面,即如果默認 1 KB 的頁面大小,那么數據庫中增長起來的一個兆字節。
## page_count Pragma
**page_count** Pragma 返回當前數據庫中的網頁數量。語法如下:
```
PRAGMA [database.]page_count;
```
數據庫文件的大小應該是 page_count * page_size。
## page_size Pragma
**page_size** Pragma 獲取或設置數據庫頁面的大小。語法如下:
```
PRAGMA [database.]page_size;
PRAGMA [database.]page_size = bytes;
```
默認情況下,允許的尺寸是 512、1024、2048、4096、8192、16384、32768 字節。改變現有數據庫頁面大小的唯一方法就是設置頁面大小,然后立即 VACUUM 該數據庫。
## parser_trace Pragma
**parser_trace** Pragma 隨著它解析 SQL 命令來控制打印的調試狀態,語法如下:
```
PRAGMA parser_trace = [true|false];
```
默認情況下,它被設置為 false,但設置為 true 時則啟用,此時 SQL 解析器會隨著它解析 SQL 命令來打印出它的狀態。
## recursive_triggers Pragma
**recursive_triggers** Pragma 獲取或設置遞歸觸發器功能。如果未啟用遞歸觸發器,一個觸發動作將不會觸發另一個觸發。語法如下:
```
PRAGMA recursive_triggers;
PRAGMA recursive_triggers = [true|false];
```
## schema_version Pragma
**schema_version** Pragma 獲取或設置存儲在數據庫頭中的的架構版本值。語法如下:
```
PRAGMA [database.]schema_version;
PRAGMA [database.]schema_version = number;
```
這是一個 32 位有符號整數值,用來跟蹤架構的變化。每當一個架構改變命令執行(比如 CREATE... 或 DROP...)時,這個值會遞增。
## secure_delete Pragma
**secure_delete** Pragma 用來控制內容是如何從數據庫中刪除。語法如下:
```
PRAGMA secure_delete;
PRAGMA secure_delete = [true|false];
PRAGMA database.secure_delete;
PRAGMA database.secure_delete = [true|false];
```
安全刪除標志的默認值通常是關閉的,但是這是可以通過 SQLITE_SECURE_DELETE 構建選項來改變的。
## sql_trace Pragma
**sql_trace** Pragma 用于把 SQL 跟蹤結果轉儲到屏幕上。語法如下:
```
PRAGMA sql_trace;
PRAGMA sql_trace = [true|false];
```
SQLite 必須通過 SQLITE_DEBUG 指令來編譯要引用的該 Pragma。
## synchronous Pragma
**synchronous** Pragma 獲取或設置當前磁盤的同步模式,該模式控制積極的 SQLite 如何將數據寫入物理存儲。語法如下:
```
PRAGMA [database.]synchronous;
PRAGMA [database.]synchronous = mode;
```
SQLite 支持下列同步模式:
| Pragma 值 | 描述 |
| --- | --- |
| 0 或 OFF | 不進行同步。 |
| 1 或 NORMAL | 在關鍵的磁盤操作的每個序列后同步。 |
| 2 或 FULL | 在每個關鍵的磁盤操作后同步。 |
## temp_store Pragma
**temp_store** Pragma 獲取或設置臨時數據庫文件所使用的存儲模式。語法如下:
```
PRAGMA temp_store;
PRAGMA temp_store = mode;
```
SQLite 支持下列存儲模式:
| Pragma 值 | 描述 |
| --- | --- |
| 0 或 DEFAULT | 默認使用編譯時的模式。通常是 FILE。 |
| 1 或 FILE | 使用基于文件的存儲。 |
| 2 或 MEMORY | 使用基于內存的存儲。 |
## temp_store_directory Pragma
**temp_store_directory** Pragma 獲取或設置用于臨時數據庫文件的位置。語法如下:
```
PRAGMA temp_store_directory;
PRAGMA temp_store_directory = 'directory_path';
```
## user_version Pragma
**user_version** Pragma 獲取或設置存儲在數據庫頭的用戶自定義的版本值。語法如下:
```
PRAGMA [database.]user_version;
PRAGMA [database.]user_version = number;
```
這是一個 32 位的有符號整數值,可以由開發人員設置,用于版本跟蹤的目的。
## writable_schema Pragma
**writable_schema** Pragma 獲取或設置是否能夠修改系統表。語法如下:
```
PRAGMA writable_schema;
PRAGMA writable_schema = [true|false];
```
如果設置了該 Pragma,則表以 sqlite_ 開始,可以創建和修改,包括 sqlite_master 表。使用該 Pragma 時要注意,因為它可能導致整個數據庫損壞。
- SQL基礎
- SQL 簡介
- SQL 語法
- SQL SELECT 語句
- SQL SELECT DISTINCT 語句
- SQL WHERE 子句
- SQL AND & OR 運算符
- SQL ORDER BY 子句
- SQL INSERT INTO 語句
- SQL UPDATE 語句
- SQL DELETE 語句
- SQL高級
- SQL TOP 子句
- SQL LIKE 操作符
- SQL 通配符
- SQL IN 操作符
- SQL BETWEEN 操作符
- SQL Alias(別名)
- SQL JOIN
- SQL INNER JOIN 關鍵字
- SQL LEFT JOIN 關鍵字
- SQL RIGHT JOIN 關鍵字
- SQL FULL JOIN 關鍵字
- SQL UNION 和 UNION ALL 操作符
- SQL SELECT INTO 語句
- SQL CREATE DATABASE 語句
- SQL CREATE TABLE 語句
- SQL 約束 (Constraints)
- SQL NOT NULL 約束
- SQL UNIQUE 約束
- SQL PRIMARY KEY 約束
- SQL FOREIGN KEY 約束
- SQL CHECK 約束
- SQL DEFAULT 約束
- SQL CREATE INDEX 語句
- SQL 撤銷索引、表以及數據庫
- SQL ALTER TABLE 語句
- SQL AUTO INCREMENT 字段
- SQL VIEW(視圖)
- SQL函數
- SQL Date 函數
- SQL NULL 值
- SQL NULL 函數
- SQL 數據類型
- SQL 服務器 - RDBMS
- SQL 函數
- SQL AVG 函數
- SQL COUNT() 函數
- SQL FIRST() 函數
- SQL LAST() 函數
- SQL MAX() 函數
- SQL MIN() 函數
- SQL SUM() 函數
- SQL GROUP BY 語句
- SQL HAVING 子句
- SQL UCASE() 函數
- SQL LCASE() 函數
- SQL MID() 函數
- SQL LEN() 函數
- SQL ROUND() 函數
- SQL NOW() 函數
- SQL FORMAT() 函數
- SQL 快速參考
- SQLite 基礎
- SQLite 簡介
- SQLite 安裝
- SQLite 命令
- SQLite 語法
- SQLite 數據類型
- SQLite 創建數據庫
- SQLite 附加數據庫
- SQLite 分離數據庫
- SQLite 創建表
- SQLite 刪除表
- SQLite Insert 語句
- SQLite Select 語句
- SQLite 運算符
- SQLite 表達式
- SQLite Where 子句
- SQLite AND/OR 運算符
- SQLite Update 語句
- SQLite Delete 語句
- SQLite Like 子句
- SQLite Glob 子句
- SQLite Limit 子句
- SQLite Order By
- SQLite Group By
- SQLite Having 子句
- SQLite Distinct 關鍵字
- SQLite 高級
- SQLite PRAGMA
- SQLite 約束
- SQLite Joins
- SQLite Unions 子句
- SQLite NULL 值
- SQLite 別名
- SQLite 觸發器(Trigger)
- SQLite 索引(Index)
- SQLite Indexed By
- SQLite Alter 命令
- SQLite Truncate Table
- SQLite 視圖(View)
- SQLite 事務(Transaction)
- SQLite 子查詢
- SQLite Autoincrement(自動遞增)
- SQLite 注入
- SQLite Explain(解釋)
- SQLite Vacuum
- SQLite 日期 & 時間
- SQLite 常用函數
- SQLite 接口
- SQLite - C/C++
- SQLite - Java
- SQLite - PHP
- SQLite - Perl
- SQLite - Python
- MySQL 教程
- MySQL 教程
- MySQL 安裝
- MySQL 管理
- MySQL PHP 語法
- MySQL 連接
- MySQL 創建數據庫
- MySQL 刪除數據庫
- MySQL 選擇數據庫
- MySQL 數據類型
- MySQL 創建數據表
- MySQL 刪除數據表
- MySQL 插入數據
- MySQL 查詢數據
- MySQL where 子句
- MySQL UPDATE 查詢
- MySQL DELETE 語句
- MySQL LIKE 子句
- MySQL 排序
- Mysql Join的使用
- MySQL NULL 值處理
- MySQL 正則表達式
- MySQL 事務
- MySQL ALTER命令
- MySQL 索引
- MySQL 臨時表
- MySQL 復制表
- MySQL 元數據
- MySQL 序列使用
- MySQL 處理重復數據
- MySQL 及 SQL 注入
- MySQL 導出數據
- MySQL 導入數據
- 免責聲明