Mysql 选择十六进制(md5(“任意”)%4;为什么这总是零?
为什么mysql中总是零Mysql 选择十六进制(md5(“任意”)%4;为什么这总是零?,mysql,Mysql,为什么mysql中总是零 select hex(md5("anything"))%4; 我尝试过用任何东西替换“任何东西”,但它总是零 预期值为0、1、2或3,但未如图所示显示 我想要(md5sum(“任何东西”)%4)。这怎么可能 这是我所需要的最佳答案/解决方案吗?感觉不对劲 SELECT CONV(SUBSTRING(md5('anything0-10'), 1, 15), 16, 10)%4096; HEX()返回十六进制数字字符串,而不是数字 mysql> select h
select hex(md5("anything"))%4;
我尝试过用任何东西替换“任何东西”,但它总是零
预期值为0、1、2或3,但未如图所示显示
我想要(md5sum(“任何东西”)%4)。这怎么可能
这是我所需要的最佳答案/解决方案吗?感觉不对劲
SELECT CONV(SUBSTRING(md5('anything0-10'), 1, 15), 16, 10)%4096;
HEX()
返回十六进制数字字符串,而不是数字
mysql> select hex(md5("anything"));
+------------------------------------------------------------------+
| hex(md5("anything")) |
+------------------------------------------------------------------+
| 6630653136366463333464313464366332323866666163353736633961343363 |
+------------------------------------------------------------------+
HEX(md5('anything'))
返回所有十进制数字。这不是巧合。MySQL的MD5()函数已经返回一个十六进制编码的字符串(对其调用hex()是多余的)。因此,它只返回字符0-9和a-f:
mysql> select md5('anything');
+----------------------------------+
| md5('anything') |
+----------------------------------+
| f0e166dc34d14d6c228ffac576c9a43c |
+----------------------------------+
对该字符串调用HEX()时,它只返回十六进制值30-39和61-66,对ascii值0-9和a-f进行编码
这就是为什么长字符串只包含十进制数字的全部原因
当您在带有%4
的表达式中使用该字符串时,MySQL将在数字上下文中解释该字符串。MySQL将尝试计算字符串的数值,这意味着从字符串中读取前导的十进制数字
我们还可以使用+0
将字符串强制为数字上下文:
mysql> select hex(md5('anything'))+0;
+------------------------------------------------------------------+
| hex(md5('anything'))+0 |
+------------------------------------------------------------------+
| 6630653136366463000000000000000000000000000000000000000000000000 |
+------------------------------------------------------------------+
64位数字大于MySQL整数类型可以表示的数字,因此数字强制必须将其转换为双精度值。此数据类型为8字节,仍然不足以表示64位数字。因此,它舍入值并忽略较低的数字,将其转换为零
自然地,以一串零结尾的数字可以被4整除,所以模表达式必然返回0
我想要(md5sum(“任何东西”)%4)。这怎么可能
HEX()
返回十六进制数字字符串,而不是数字
mysql> select hex(md5("anything"));
+------------------------------------------------------------------+
| hex(md5("anything")) |
+------------------------------------------------------------------+
| 6630653136366463333464313464366332323866666163353736633961343363 |
+------------------------------------------------------------------+
HEX(md5('anything'))
返回所有十进制数字。这不是巧合。MySQL的MD5()函数已经返回一个十六进制编码的字符串(对其调用hex()是多余的)。因此,它只返回字符0-9和a-f:
mysql> select md5('anything');
+----------------------------------+
| md5('anything') |
+----------------------------------+
| f0e166dc34d14d6c228ffac576c9a43c |
+----------------------------------+
对该字符串调用HEX()时,它只返回十六进制值30-39和61-66,对ascii值0-9和a-f进行编码
这就是为什么长字符串只包含十进制数字的全部原因
当您在带有%4
的表达式中使用该字符串时,MySQL将在数字上下文中解释该字符串。MySQL将尝试计算字符串的数值,这意味着从字符串中读取前导的十进制数字
我们还可以使用+0
将字符串强制为数字上下文:
mysql> select hex(md5('anything'))+0;
+------------------------------------------------------------------+
| hex(md5('anything'))+0 |
+------------------------------------------------------------------+
| 6630653136366463000000000000000000000000000000000000000000000000 |
+------------------------------------------------------------------+
64位数字大于MySQL整数类型可以表示的数字,因此数字强制必须将其转换为双精度值。此数据类型为8字节,仍然不足以表示64位数字。因此,它舍入值并忽略较低的数字,将其转换为零
自然地,以一串零结尾的数字可以被4整除,所以模表达式必然返回0
我想要(md5sum(“任何东西”)%4)。这怎么可能
我的猜测如下:
返回字符串hex(md5(“任何”))
执行隐式转换为双精度%
- 铸造降低了钻头的高度
- 删除两个低位后,每个数字是4的倍数
%4
操作,只有最后一个十六进制数字是相关的,因此您可以:
- 从MD5和中获取最后一个十六进制数字
- 将其转换为基数10
- 执行%4操作
我的猜测如下:
返回字符串hex(md5(“任何”))
执行隐式转换为双精度%
- 铸造降低了钻头的高度
- 删除两个低位后,每个数字是4的倍数
%4
操作,只有最后一个十六进制数字是相关的,因此您可以:
- 从MD5和中获取最后一个十六进制数字
- 将其转换为基数10
- 执行%4操作
hex(md5(“任何”))
返回字符串而不是数字。不完全确定接下来会发生什么导致0,但这是问题的核心。hex(md5(“任何”)
返回字符串而不是数字。不完全确定接下来会发生什么,结果是0,但这是问题的核心。答案很好。我想要(md5sum(“任何东西”)%4)。这怎么可能?很好的解释,很好的回答。我想要(md5sum(“任何东西”)%4)。这怎么可能?非常好的解释我想要(md5sum(“任何”)%4)。这怎么可能?我想要(md5sum(“任何东西”)%4)。这怎么可能?