我想存储十六进制格式的sqlite3 DB中使用c++的IP地址。我使用文本作为存储十六进制值的格式。我想对数据库中插入的值执行检查。我要检查的取值范围是0x00000000 - 0xFFFFFFFF。对于整数类型,您可以通过检查(num介于0和100之间)进行检查。有没有办法为十六进制值添加检查约束?
如果有更聪明的方式在SQLITE中存储IP地址,请与我分享。
谢谢
发布于 2016-12-31 07:20:19
我认为你有两个主要的选择:(a)存储为十六进制(即文本)并检查“十六进制一致性”,或(b)存储为整数并在读取数据时将其打印为十六进制。
例如,如果应用程序实际提供和接收整数值,则可能有几个原因优先选择其中一个。无论如何,选择(a)和(b)的一些例子。
选项(a) -存储为文本并检查十六进制符合性
最简单的方法可能是使用基于CL注释的GLOB的检查:
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) -存储为整数并打印为十六进制
如果您的应用程序实际上正在处理整数,则将您的db模式更改为整数,并添加如下检查:
value INTEGER CONSTRAINT "valueIsValid" CHECK(value <= 0xFFFFFFFF)为方便起见,您仍然可以使用查询(或定义相应的视图)将值打印为十六进制,如下所示:
select printf('%08X', value) from theTablehttps://stackoverflow.com/questions/41398816
复制相似问题