我认为您有两个主要选择:(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