MySQL.exe命令行中WHERE子句的GREATER THAN过滤器失效问题
哦,我明白你之前的困惑了——一开始以为是MySQL的datetime解析出了问题,但后来发现其实是命令提示符(CMD)里的字符串转义错误对吧?这确实很容易混淆,毕竟同样的查询在其他环境下都能正常工作,只有用mysql.exe命令行执行时出问题。
咱们来理清楚:当你在CMD里直接用mysql.exe -e执行SQL语句时,CMD会先解析你的命令参数,如果你直接用双引号包裹SQL,CMD可能会把引号内的部分错误拆分,或者特殊字符(比如空格、引号)被提前解析,导致实际传递给MySQL服务器的SQL语句并不是你写的那个。这时候就需要用^来转义那些会被CMD解析的字符。
举个例子,假设你原来的命令是这样的:
mysql -u root -p my_db -e "SELECT * FROM orders WHERE order_time > '2018-04-10 00:00:00'"
在CMD里,这个命令可能会因为双引号的问题导致SQL被截断,你需要把双引号用^转义,改成:
mysql -u root -p my_db -e ^"SELECT * FROM orders WHERE order_time > '2018-04-10 00:00:00'^"
这样CMD就会把整个SQL语句完整传递给MySQL,服务器收到正确的查询后,就能正常用datetime值过滤记录了。
为什么之前在其他场景(比如MySQL客户端直接输入、或者应用程序里调用)没问题?因为那些环境不会像CMD这样对命令参数做额外的解析,SQL语句能原封不动地传到服务器,自然能正常工作。
总结一下:问题根源不是MySQL对datetime的解析逻辑,而是CMD的命令行参数解析规则,只要用^正确转义SQL语句里的引号(或者其他CMD会解析的特殊字符),就能解决这个问题啦。
内容的提问来源于stack exchange,提问作者Nicholas
相关产品推荐
相关产品推荐

