You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SQL BETWEEN运算符用于十六进制字符串与转数值后结果是否一致?

十六进制字符串BETWEEN与十进制数值BETWEEN的结果差异

这两个查询的结果不一定相同,核心差异在于字符串比较和数值比较的逻辑完全不同,具体分析如下:

1. 两种BETWEEN操作的本质区别

十进制数值的BETWEEN

直接按数学上的数值大小范围筛选,BETWEEN 9387 AND 33503等价于筛选十六进制值在0x24ab到0x82df之间的产品ID,完全遵循数值大小逻辑。

十六进制字符串的BETWEEN

按字符串字典序筛选,逻辑是逐字符对比编码值(通常为ASCII/UTF-8):
只有当产品ID的字符串在字典序上满足"24ab" ≤ product_id ≤ "82df"时才会被选中。

结果相同的场景

如果产品ID都是固定长度的4位十六进制字符串,字符串字典序和十六进制数值大小完全一致——因为十六进制字符的顺序(0-9<a-f)刚好和ASCII编码顺序匹配,此时两个查询结果会相同。

结果不同的场景

只要存在非固定长度的十六进制字符串,结果就会出现差异:

  • 比如产品ID是"10000"(5位十六进制,十进制65536):数值远大于33503,不会被第二个查询选中;但字符串字典序中"10000"的首字符'1'(ASCII 49)小于"82df"的首字符'8'(ASCII 56),会被第一个查询选中。
  • 再比如产品ID是"0024ab"(6位十六进制,十进制9387):数值刚好是范围下限,会被第二个查询选中;但字符串字典序中"0024ab"的首字符'0'小于"24ab"的首字符'2',会被第一个查询排除。

2. 字符串比较的规则

SQL中的字符串比较确实是基于字符的ASCII(或UTF-8)编码值逐位进行的:

  • 从字符串的第一个字符开始,依次对比对应位置的字符编码值;
  • 若某一位的编码值不同,直接以此位的大小判断整个字符串的大小;
  • 若前面所有字符都相同,则较短的字符串更小(部分数据库会补空格至相同长度后再比较,比如MySQL的特定模式)。

举几个直观例子:

  • "a" > "9":因为'a'的ASCII值是97,'9'是57;
  • "ab" > "aa":第二位'b'(98)的编码值大于'a'(97);
  • "abc" < "abcd":前三位字符完全相同,较短的字符串更小。

内容的提问来源于stack exchange,提问作者user19483562

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.23 11:18:28