繁体   English   中英

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

[英]Why comparing Strings in MySQL query is not working

我在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

从评论中重申; 有时,“非打印”控制字符(例如换行符)可能会进入到它们原本不想包含的数据中。 您可以通过检查字段值的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), '')删除令人反感的字符。 同样,使用您实际观察到的导致问题的代码; 如果您能更好地处理情况(例如两个单词之间的换行符),则可以将其转换为空格。

您是否尝试过将LIKE用于调试目的?
SELECT * FROM table_name WHERE string_name LIKE 'This is string one'

/!\\不要只是从=切换为LIKE在这里了解为什么
TLDR:

  1. =显然快了30倍。
  2. 可能的地方使用=必须的地方使用LIKE

首先,我必须承认@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和对此有更好了解的其他人发布一种更通用的方法,以便它可以对其他人有所帮助,因为我认为许多在这种情况下找不到正确方法的人最终会使用LIKE代替=但是那完全改变了查询的核心思想。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM