十六进制值的 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 约束的主要内容,如果未能解决你的问题,请参考以下文章

如何将十六进制值的总和转换回十六进制值

详细请教:关于十进制RGB颜色值转换十六进制颜色值的算法

详细请教:关于十进制RGB颜色值转换十六进制颜色值的算法

将十六进制值的列表/字符串解压缩为整数

将包含十六进制值的字节数组转换为十进制值

JavaScript随机生成颜色以及十六进制颜色 与RGB颜色值的相互转换