【问题标题】:SQLITE CHECK constraint for hex values十六进制值的 SQLITE CHECK 约束
【发布时间】:2016-12-30 15:41:07
【问题描述】:

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

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

谢谢

【问题讨论】:

  • “更智能”取决于你想用它做什么。无论如何,请使用GLOB

标签: c++ sqlite


【解决方案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。如需有关用户定义函数的帮助,请发送电子邮件,例如 StackOverflow answer

选项 (b) - 存储为 int 并打印为 hex

如果您的应用程序实际上正在使用整数,则将您的数据库架构更改为整数并添加如下检查:

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

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

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

【讨论】:

    猜你喜欢
    • 2018-07-26
    • 2021-11-14
    • 1970-01-01
    • 1970-01-01
    • 2020-11-01
    • 2011-12-09
    • 2014-11-30
    • 2020-10-25
    相关资源
    最近更新 更多