2016-12-30 340 views
0

我想使用C++在sqlite3數據庫中以十六進制格式存儲IP地址。我正在使用TEXT作爲存儲十六進制值的格式。我想對數據庫中插入的值執行檢查。我想檢查的值範圍是0x00000000 - 0xFFFFFFFF。對於INTEGER類型,您可以通過 - CHECK(num BETWEEN 0和100)進行檢查。有什麼辦法可以爲十六進制值添加檢查約束嗎?對於十六進制值的SQLITE CHECK約束

如果有一種更智能的方式在SQLITE中存儲IP地址,請與我分享。

感謝

+0

「更智能」取決於你想要用它做什麼。無論如何,請使用[GLOB](https://sqlite.org/lang_expr.html#like)。 –

回答

1

我認爲你有兩個主要選擇:(a)儲存爲十六進制(即文本),並檢查「六角合格」,或(b)店作爲整數和讀取數據時打印爲十六進制。

可能有好幾個理由選擇一個優於另一個,例如,如果應用程序實際提供並接收整數值。無論如何,選項(a)和選項(b)的一些例子。

方案(a) - 商店文本和檢查六角符合

的可能最簡單的方法是使用基於GLOB檢查由CL來作爲評論:

value TEXT CONSTRAINT "valueIsHex" CHECK(value GLOB "0x[a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9][a-fA-F0-9]") 

如果邏輯超出了GLOB支持的範圍,您可以安裝一個用戶定義的功能,可以是一般的regexp()功能或自定義功能以滿足您的特定需求。如果您想在一個字段中存儲完整的IP地址,並且仍然希望進行符合性檢查,則可能會出現這種情況。有關一般regexp()功能的幫助,請發送this SO answer。例如,有關用戶定義功能的幫助,請參閱StackOverflow answer

方案(b) - 商店爲int和打印爲十六進制

如果您的應用程序實際上是與整數工作,那麼改變你的DB模式爲整數,並添加一個檢查,如:

value INTEGER CONSTRAINT "valueIsValid" CHECK(value <= 0xFFFFFFFF) 

爲方便起見,仍然可以使用查詢(或定義相應視圖)來打印十六進制值,如下所示:

select printf('%08X', value) from theTable