SELECT * FROM tableName WHERE' num + sometext'

时间:2018-02-23 06:20:59

标签: mysql sql

我很想知道这些查询在数据库引擎中是如何工作的。特别是我的重点是第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?

4 个答案:

答案 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 =假,其他数字=真)时,它会查找数字。

  • 1和123是导致为真的数字。
  • &#39; 2xyz&#39;转换为2,即为真。
  • &#39;&#39;和&#39; xyz&#39;转换为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