十六进制值的SQLITE CHECK约束
SQLITE CHECK constraint for hex values
我想使用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
相关文章:
- CHECK(调用)函数在Google Colab中出错
- 函数作为模板参数,是否对返回类型强制约束
- 约束和显式模板实例化
- IpOpt拒绝解决不受约束的问题
- 使用C++模板时表达约束
- 如何在 SCIP C++ 接口中获取 MILP 约束矩阵中的系数值
- 受约束的成员函数和显式模板实例化
- 具有多种约束(例如重量、体积等)的背包
- 'make check' GLIBC 运行时的链接问题
- 为什么我会收到"Run-Time Check Failure #2 - Stack around the variable 'pr' was corrupted"错误?
- Gecode 与 Z3 用于约束随机化
- 如果原型是本地的,则使用流 I/O C++类型约束将失败
- C++打开具有 2 个约束的文件
- 如何拥有受约束的运算符模板?
- 不生成单独约束的变量的 Gurobi 影子价格
- 在 C++20 中对概念约束函数进行排序的规则是什么?
- 如何使用 g2o 优化多约束函数
- 约束类模板函数以接受特定的 POD 类型
- 约束包容是否仅适用于概念?
- 十六进制值的SQLITE CHECK约束