我正在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
。
答案 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:
=
显然快30倍。
- 在您可以的任何地方使用
=
,在您必须的任何地方使用LIKE
。
答案 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
,但这完全改变了查询的核心思想。