Mysql 选择十六进制(md5(“任意”)%4;为什么这总是零?

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

为什么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 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)。这怎么可能?