我第一次看到此sql行为。我不知道如何检查或怎么做。新年过后,我们的系统之一开始做奇怪的事情。我在我们公司的系统中找到了这段代码
SELECT masinu_galiojimai. * ,
galiojimu_tipai.pavadinimas,
galiojimu_tipai.ispeti_pries_x_dienu,
masinos.masinos_nr AS masina,
IF( DATEDIFF( masinu_galiojimai.galioja_iki, CURDATE( ) ) <0, "baigesi", 2 *2 ) AS liko
FROM masinos
LEFT JOIN masinu_galiojimai ON masinu_galiojimai.masinos_id = masinos.id
LEFT JOIN galiojimu_tipai ON masinu_galiojimai.ispejimo_id = galiojimu_tipai.id
如您所见,如果逻辑为TRUE,则应输出单词:baigesi;如果为false,则应计算为2 * 2(我自行更改以进行测试) 结果我得到2 * 2不是4,而是62616967657369。这怎么可能?如果我尝试减去今天和2018-12-31,我得到的不是13天,而是8880。
服务器时间运行良好,没问题。我需要从哪里开始检查?
编辑:为了更好地理解,我包括照片。如您所见,没有单词:baigese,也没有正确的数学答案:
答案 0 :(得分:1)
您的结果“正确”,但显示为十六进制字符串。
ASCII中的'4'为0x34
'baigesi' b => 62 一个=> 61
等,所以最终得到62616967657369
这很可能是phpmyadmin的配置,因为它是在4转换为字符串后发生的。尝试使用其他客户端,看看会得到什么结果。
另一种可能性是连接上的排序规则设置。查看此错误报告 https://bugs.mysql.com/bug.php?id=35211
这似乎是在连接协议上使用utf8_bin编码的结果。
答案 1 :(得分:0)
这不会解决您的问题,但是会给您一个提示。
ASCII codes in hex:
0x62 0x61 0x69 0x67 0x65 0x73 0x69
b a i g e s i
因此,当您获得62616967657369
时,它不是2*2
的对象,而不是baigesi
的对象。