[英]Why comparing Strings in MySQL query is not working
我在MySQL中运行一个非常简单的SELECT查询,但无法正常工作。
SELECT string_name FROM table_name;
这给了我所需的输出。 喜欢
等等...
但是如果我正在运行这样的查询
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:
=
显然快了30倍。- 在可能的地方使用
=
在必须的地方使用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.