我收到这个错误
操作的排序规则的非法混合<=
对于以下 WHERE 子句:
time(table1.dt1)<=date_add(table1.tim,interval 60 second)
dt1 = datetime
,tim = time
有人知道为什么吗?
我收到这个错误
操作的排序规则的非法混合<=
对于以下 WHERE 子句:
time(table1.dt1)<=date_add(table1.tim,interval 60 second)
dt1 = datetime
,tim = time
有人知道为什么吗?
如手册条目中所述DATE_ADD()
:
返回值取决于参数:
在您的情况下,因为table1.tim
是一个TIME
值,所以该函数返回一个字符串。
字符串以 and 给出的字符集和排序规则character_set_connection
返回collation_connection
。
如手册条目中所述TIME()
:
提取时间或日期时间表达式的时间部分
expr
并将其作为字符串返回。
该字符串作为二进制字符串返回(为什么不使用连接字符集和排序规则超出了我的范围——也许是一个错误?)。
正如在表达式评估中的类型转换的手册条目中所解释的:
如果比较操作中的两个参数都是字符串,则将它们作为字符串进行比较。
因此,所进行的比较是字符串比较,但binary
不能将字符串强制转换为合适的排序规则进行比较(因为它的编码未知)。因此,您正在目睹的错误。
可以通过显式转换一个或两个操作数来强制正确进行比较,但我很想重新编写该子句,以便从与类型的比较中隐式进行转换TIME
:
TIME(table1.dt1 - INTERVAL 1 MINUTE) <= table1.tim