为什么mysql中总是零?
select hex(md5("anything"))%4; 我试过用任何东西代替“任何东西”,但总是零。
预期值为0、1、2或3,但没有如图所示。
我想要(md5sum(“任何”)% 4)。这怎麽可能?
,这是我所需要的最好的答案/解决方案吗?感觉不对
SELECT CONV(SUBSTRING(md5('anything0-10'), 1, 15), 16, 10)%4096;发布于 2020-01-07 16:41:15
HEX()返回十六进制数字的字符串,而不是数字。
mysql> select hex(md5("anything"));
+------------------------------------------------------------------+
| hex(md5("anything")) |
+------------------------------------------------------------------+
| 6630653136366463333464313464366332323866666163353736633961343363 |
+------------------------------------------------------------------+HEX(md5('anything'))返回所有十进制数字。这不是巧合。MySQL的MD5()函数已经返回了一个十六进制编码的字符串(在它上调用HEX()是多余的)。因此,它只返回字符0-9和a:
mysql> select md5('anything');
+----------------------------------+
| md5('anything') |
+----------------------------------+
| f0e166dc34d14d6c228ffac576c9a43c |
+----------------------------------+在此字符串上调用HEX()时,它只返回十六进制值30-39和61-66,编码的ascii值为0-9和a。
这都是为了解释为什么长字符串只包含十进制数字。
在使用% 4的表达式中使用该字符串时,MySQL将在数字上下文中解释该字符串。MySQL将尝试计算字符串的数值,这意味着从字符串中读取前面的十进制数字。
我们还可以使用+0将字符串强制置于数值上下文中。
mysql> select hex(md5('anything'))+0;
+------------------------------------------------------------------+
| hex(md5('anything'))+0 |
+------------------------------------------------------------------+
| 6630653136366463000000000000000000000000000000000000000000000000 |
+------------------------------------------------------------------+64位数字比MySQL整数类型所能表示的要大,因此数值强制必须将其转换为双值。此数据类型为8个字节,仍不足以表示64位数字.因此,它舍入值并忽略较低的数字,将其转换为零。
当然,以一串零结尾的数字可以被4整除,所以模数表达式一定要返回0。
i想要(md5sum(“任何东西”)% 4)。这怎麽可能?
mysql> select conv(right(md5('anything'), 1), 16, 10) % 4 as mod4;
+------+
| mod4 |
+------+
| 0 |
+------+发布于 2020-01-07 16:41:28
我的猜测如下:
hex(md5("anything"))返回一个字符串,%执行隐式强制转换为DOUBLE,的乘积。
对于%4操作,只有最后一个十六进制数字是相关的,所以您可以:
SELECT CONV(SUBSTRING(md5('anything'), -1), 16, 10)%4;https://stackoverflow.com/questions/59632168
复制相似问题