十六进制值的SQLITE CHECK约束

SQLITE CHECK constraint for hex values

本文关键字:CHECK 约束 SQLITE 十六进制      更新时间:2023-10-16

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

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

感谢

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

偏好一个而不是另一个可能有几个原因,例如,如果应用程序实际提供和接收整数值。无论如何,选项(a)和选项(b)的一些例子。

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

可能最简单的方法是使用基于GLOB的检查,如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()功能的帮助,请提供此SO答案。例如,要获得有关用户定义函数的帮助,请提供以下StackOverflow答案。

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

如果您的应用程序实际上使用整数,那么将数据库模式更改为integer,并添加一个检查,如:

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

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

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