我很想知道这些查询在数据库引擎中是如何工作的。特别是我的重点是第4和第6行。
Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
at sun.security.ssl.Alerts.getSSLException(Alerts.java:192)
at sun.security.ssl.Alerts.getSSLException(Alerts.java:154)
at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:2033)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1135)
at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1385)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1413)
at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1397)
at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:559)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:185)
at sun.net.www.protocol.https.HttpsURLConnectionImpl.connect(HttpsURLConnectionImpl.java:153)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:730)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:757)
at org.jsoup.helper.HttpConnection$Response.execute(HttpConnection.java:706)
at org.jsoup.helper.HttpConnection.execute(HttpConnection.java:299)
在上面的查询中,1,2,3,4产生相同的结果,但5和6没有产生任何结果。为什么?什么是差异b / w WHERE' 2xyx'和' xyz'? 如何' 2xyz'隐含地转换成2?
答案 0 :(得分:2)
where
子句的计算结果为布尔值true(非0)或false(0),以便判断记录是否在结果集中。
案例2和3会检索所有记录,因为非零数字会评估为真。
案例3检索所有记录,因为在隐式字符串到数字转换期间,mysql逐字符地从左到右计算字符串。只要字符可以作为数字进行求值,mysql就会占用它们的值。这包括切割前导空格,解释加号或减号,小数点等。因此,字符串'2xyx'
被解释为2,因此布尔值为真。
案例4和5不检索任何记录,因为字符串的最左边的字符不能被计算为数字,因此转换返回0,因此布尔值为假。
不幸的是,MySQL手册中没有真正记录到数字转换的隐式字符串。但是,大多数规则可以从手册的Type Conversion in Expression Evaluation部分的以下部分中扣除:
为了比较字符串列和数字,MySQL不能使用 列上的索引可以快速查找值。如果str_col是 索引字符串列,执行时不能使用索引 在以下语句中查找:
SELECT * FROM tbl_name WHERE str_col=1;1
这样做的原因是可能存在许多不同的字符串 转换为值1,例如“1”,“1”或“1a”。
答案 1 :(得分:0)
是WHERE <condition>
,例如WHERE col1 = 123
。你所拥有的是WHERE <number>
或WHERE <string>
,因此缺少一个表达式。
尽管可能是WHERE <boolean>
,但这正是MySQL所期望的。而且,当MySQL将布尔数视为数字(0 =假,其他数字=真)时,它会查找数字。
所以后者给你一个空的结果集,因为where条件呈现为false。
答案 2 :(得分:0)
在语句SELECT ... WHERE [where_condition]
中,在where_condition
expression中,您可以使用MySQL支持的任何函数和运算符,其中也支持string literal。对于字符串,比较基于字符串单元的数值。在评估表达式时type conversion也已完成。
因此,在上面的情况下, 2xyz 会转换为 2 ,即true
,因此您将获得所有记录。就像
SELECT * FROM tableName WHERE 2
并且字符串 xyz 会转换为 0 ,这是false
,因为您获得了空结果集。与:相同:
SELECT * FROM tableName WHERE 0
答案 3 :(得分:0)
有条件值的地方。 Mysql任何数字都视为TRUE值而为null或''视为FALSE。
1.SELECT * FROM tableName -- all record return
2.SELECT * FROM tableName WHERE 1 -- Return true value
3.SELECT * FROM tableName WHERE 123 -- Return true value
4.SELECT * FROM tableName WHERE '2xyz' -- Return true value because there first character is number
5.SELECT * FROM tableName WHERE '' -- false value return
6.SELECT * FROM tableName WHERE 'xyz' -- false value return