十六进制值的 SQLITE CHECK 约束
Posted
技术标签:
【中文标题】十六进制值的 SQLITE CHECK 约束【英文标题】:SQLITE CHECK constraint for hex values 【发布时间】:2016-12-30 15:41:07 【问题描述】:我想使用 c++ 在 sqlite3 DB 中以十六进制格式存储 IP 地址。我使用 TEXT 作为存储十六进制值的格式。我想检查插入数据库中的值。我要检查的值范围是 0x00000000 - 0xFFFFFFFF。对于 INTEGER 类型,您可以通过 - CHECK (num BETWEEN 0 AND 100) 进行检查。有没有办法为十六进制值添加检查约束?
如果有更聪明的方法在 SQLITE 中存储 IP 地址,请与我分享。
谢谢
【问题讨论】:
“更智能”取决于你想用它做什么。无论如何,请使用GLOB。 【参考方案1】:我认为您有两个主要选择:(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。如需有关用户定义函数的帮助,请发送电子邮件,例如 *** answer。
选项 (b) - 存储为 int 并打印为 hex
如果您的应用程序实际上正在使用整数,则将您的数据库架构更改为整数并添加如下检查:
value INTEGER CONSTRAINT "valueIsValid" CHECK(value <= 0xFFFFFFFF)
为方便起见,您仍然可以使用如下查询(或定义相应视图)将值打印为十六进制:
select printf('%08X', value) from theTable
【讨论】:
以上是关于十六进制值的 SQLITE CHECK 约束的主要内容,如果未能解决你的问题,请参考以下文章