gpt4 book ai didi

c++ - 十六进制值的 SQLITE CHECK 约束

转载 作者:行者123 更新时间:2023-11-28 05:21:33 24 4
gpt4 key购买 nike

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

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

谢谢

最佳答案

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

可能有多种原因使您更喜欢其中一种,例如如果应用程序实际提供和接收整数值。无论如何,选项 (a) 和选项 (b) 的一些示例。

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

可能最简单的方法是使用基于 CLOB 的检查,如 CL 所言:

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)

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

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

关于c++ - 十六进制值的 SQLITE CHECK 约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41398816/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com