十六进制值的SQLITE CHECK约束

时间:2016-12-30 15:41:08

标签: c++ sqlite

我想在十六进制格式的sqlite3数据库中使用c ++存储IP地址。我使用TEXT作为存储十六进制值的格式。我想检查数据库中插入的值。我想检查的值范围是0x00000000 - 0xFFFFFFFF。对于INTEGER类型,您可以通过 - CHECK(num BETWEEN 0和100)进行检查。有没有办法为Hex值添加检查约束?

如果有更智能的方法在SQLITE中存储IP地址,请与我分享。

由于

1 个答案:

答案 0 :(得分: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形式存储并以十六进制打印

如果您的应用程序实际上使用整数,那么将您的数据库模式更改为整数并添加如下的检查:

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

为方便起见,您仍然可以使用查询(或定义相应的视图)将值打印为十六进制,如下所示:

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