首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >十六进制值的SQLITE检查约束

问十六进制值的SQLITE检查约束
EN

Stack Overflow用户
提问于 2016-12-30 23:41:08
回答 1查看 378关注 0票数 0

我想存储十六进制格式的sqlite3 DB中使用c++的IP地址。我使用文本作为存储十六进制值的格式。我想对数据库中插入的值执行检查。我要检查的取值范围是0x00000000 - 0xFFFFFFFF。对于整数类型,您可以通过检查(num介于0和100之间)进行检查。有没有办法为十六进制值添加检查约束?

如果有更聪明的方式在SQLITE中存储IP地址,请与我分享。

谢谢

EN

回答 1

Stack Overflow用户

发布于 2016-12-31 07:20:19

我认为你有两个主要的选择:(a)存储为十六进制(即文本)并检查“十六进制一致性”,或(b)存储为整数并在读取数据时将其打印为十六进制。

例如,如果应用程序实际提供和接收整数值,则可能有几个原因优先选择其中一个。无论如何,选择(a)和(b)的一些例子。

选项(a) -存储为文本并检查十六进制符合性

最简单的方法可能是使用基于CL注释的GLOB的检查:

代码语言:javascript
复制
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模式更改为整数,并添加如下检查:

代码语言:javascript
复制
value INTEGER CONSTRAINT "valueIsValid" CHECK(value <= 0xFFFFFFFF)

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

代码语言:javascript
复制
select printf('%08X', value) from theTable
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41398816

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档