为什么在MySQL查询中比较字符串不起作用

时间:2019-05-28 20:55:39

标签: php mysql

我正在MySQL中运行一个非常简单的SELECT查询,但无法正常工作。

SELECT string_name FROM table_name;

这给了我所需的输出。喜欢

  1. 这是字符串一。
  2. 这是第二个字符串。
  3. 这是字符串三。

以此类推...

但是如果我正在运行这样的查询

SELECT * FROM table_name WHERE string_name='This is string one'

没有给出任何输出。我什至尝试了TRIM函数。

SELECT * FROM table_name WHERE TRIM(string_name)=TRIM('This is string one')

但是它仍然没有给出任何输出。

请在这里建议我所缺少的。是由于某种格式还是我在做任何愚蠢的错误。顺便说一下,字符串在数据库中另存为VARCHAR

3 个答案:

答案 0 :(得分:1)

重申评论;有时,“非打印”控制字符(例如换行符)可能会进入到它们原本不想包含的数据中。您可以通过检查字段值的CHAR_LENGTH与实际看到的值来进行测试。显然,在大量数据上这可能很困难;但是如果您已经知道一个有问题的值,则可以使用此方法在尝试确定有问题的字符之前确认该行的问题。

一旦确认此问题,就可以对MySql的ASC()和子字符串函数使用查询来识别字符代码,直到找到字符为止。最好从字符串的末尾开始,然后重新进行,因为有问题的字符通常在末尾。

在已知问题行中标识的一个或多个字符通常也是其他问题行的原因,因此,在一个已知行中标识问题实际上可以帮助解决所有此类问题。

一旦识别出字符代码,诸如WHERE string_name LIKE CONCAT('%', CHAR(13), CHAR(10))之类的查询就可以工作(在这种情况下,对于传统的Windows换行符)可以识别其他类似的问题行。显然,请根据您的情况调整字符代码和通配符。

如果没有行在任何地方都没有这些字符,则应该能够使用如下更新来清理数据: UPDATE theTable SET theString = REPLACE(REPLACE(theString, CHAR(10), ''), CHAR(13), '')删除有问题的字符。同样,使用您实际观察到的导致问题的代码;并且如果可以更好地处理这种情况,可以将它们转换为空格,例如两个单词之间的换行符。

答案 1 :(得分:0)

您是否尝试过使用LIKE进行调试?
SELECT * FROM table_name WHERE string_name LIKE 'This is string one'

/!\不要只从=切换到LIKE,而是要了解为什么here
TLDR:

  
      
  1. =显然快30倍。   
  2.   
  3. 在您可以的任何地方使用=,在您必须的任何地方使用LIKE
  4.   

答案 2 :(得分:0)

首先,我必须承认@Uueerdo提出的观点实际上是造成此问题的主要原因。甚至我还确定字符串中有一些隐藏的字符会导致所有问题,但是我不确定如何找到并修复该令人讨厌的字符。

此外,@ Uueerdo建议的使用ASCII代码检查和替换有问题的字符的方法似乎很合法,但正如他本人提到的那样,此过程将花费很多时间,因此必须手动检查每个字符串以查找有问题的字符,然后将其替换。

幸运的是,在花了几个小时之后,我想出了一种更快的方法来解决此问题。为此,我首先要分享用例。

我的第一个查询是从数据库中选择所有字符串并在页面上打印结果。

$result = mysqli_query($conn, "SELECT * from table_name");
while($row = mysqli_fetch_array($result)){
   $string_var = $row["string_name"]; 
   echo $string_var;
   echo "<br>";
}

上面的代码按预期工作,并打印了表中的所有string_name。现在,如果我想在同一表中的另一个SELECT查询中使用变量$string_var,那么它给我0个结果。

$result = mysqli_query($conn, "SELECT * FROM table_name");
while($row = mysqli_fetch_array($result)){
    $string_var = $row["string_name"];
    echo "String Name : ".$string_var."";
    $sec_result = ($conn, "SELECT * FROM table_name WHERE string_var='$string_name'");
    if(mysqli_num_rows($sec_result) > 0){
        echo "Has Results";
    } else {
        echo "No Results";
    }
}

在此代码段中,我的第二个查询$sec_result始终没有输出任何结果。

我为解决此问题所做的一切。

$result = mysqli_query($conn, "SELECT * FROM table_name";
while ($row = mysqli_fetch_array($result)){
    $string_var = $row["string_name"];
    $row_id = $row["id"];

    $update_row = mysqli_query($conn, "UPDATE table_name SET string_name='$string_var' WHERE id=$row_id");
}

此步骤更新了表中的所有字符串,而没有引起任何隐藏/问题的字符。

我并没有推广这种方法,也不确定是否在每种用例中都可以使用,但是它帮助我在不到一分钟的时间内解决了问题。

我要求@Uueerdo和对此有更好了解的其他人发布更通用的方法,以便对其他人有所帮助,因为我认为许多在这种情况下找不到正确方法的人最终会使用{{1} }代替LIKE,但这完全改变了查询的核心思想。