将字符串与数据库中的字符串进行比较返回 false

Posted

技术标签:

【中文标题】将字符串与数据库中的字符串进行比较返回 false【英文标题】:Comparing a string to it's equal in a database returns false 【发布时间】:2020-03-23 22:34:35 【问题描述】:

我想在我的数据库中找出哪一行的“路径”字段的值等于字符串"c:\something\somethingelse\anotherthing.thing"。 在发出SQL 请求之前,我通过浏览找到了该行并复制了它的内容:

C# 方面,我的代码如下所示: 编辑:由于@CompuChip 的评论,我编辑了我希望可能会更好的东西

    String MyPath = "c:\\something\\somethingelse\\anotherthing.thing"
    MyPath = String.Format("select * from x where path = '0'", MyPath);

然后我调用了方法来创建请求并将请求发送到我的数据库,但我遇到了一个异常

我在我的数据库上尝试了请求本身,但即使我复制了确切的值,它也找不到该行: 这是我尝试过的:

Select * from x where path = "c:\something\somethingelse\anotherthing.thing"
Select * from x where STRCMP(path, "c:\something\somethingelse\anotherthing.thing") = 0

有没有正确比较字符串并找到我的行的好方法? 感谢您抽出宝贵时间,祝您有美好的一天。 编辑 2: 我还尝试在 C# 中获取我的所有行,然后一一比较它们。 它起作用了,但是超过 10K 行它开始消耗资源

【问题讨论】:

"但我遇到了异常" - 那会是什么异常? 在 sql 中,字符串带有单个 qoutes, 不要这样构造你的SQL查询。 ***.com/questions/7505808/… 不仅添加参数是安全的做法,它还可以让您的引用问题不再是问题。 我添加了 mysql Workbench 看来我必须在 C# 中做同样的事情,并在路径中放置两个反斜杠而不是一个,即使在 MySQL 中请求也适用于 MySQL,但我仍然在 C# 中收到错误跨度> 【参考方案1】:

拜托,拜托,拜托不要这样构造你的 SQL 查询。

正确的解决方案是使用参数,如下所述: Why do we always prefer using parameters in SQL statements?

你的 C# 代码会变成这样(改编自链接的答案):

string sql = "select * from x where path = @path";

using (SqlCommand command = new SqlCommand(sql, connection))

    var pathParam = new SqlParameter("path", SqlDbType.VarChar);
    pathParam.Value = @"c:\something\somethingelse\anotherthing.thing";

    command.Parameters.Add(pathParam);
    var results = command.ExecuteReader();

或者,对于 MySql,

string sql = "select * from x where path = ?path";

using (MySqlCommand command = new MySqlCommand(sql, connection))

    var pathParam = new MySqlParameter("path",
      @"c:\something\somethingelse\anotherthing.thing");

    command.Parameters.Add(pathParam);
    var results = command.ExecuteReader();

假设您(已经检查过您)实际上在数据库中有匹配的记录,那么问题可能出在引用或值的转义上。 如果确实如此,那么使用参数来检索记录不仅是安全的做法,它还会使您的引用或转义问题不再是问题。

【讨论】:

糟糕,我刚刚编辑了我的帖子,然后看到了你的答案,我要更改我的代码 我认为现在的问题是针对 MySQL 的。更新您的答案以改用MySqlCommand,尽管关键点保持不变。 问题似乎是因为我正在寻找文件路径(带有反斜杠等),当我正在寻找另一种类型的字符串时,假设“名称”我会找到一些行 感谢@TanveerBadar,添加了,但我不经常使用 MySQL,所以我希望我的语法正确。 是的,我觉得很好。【参考方案2】:

看来我必须在 C# 中做同样的事情,并在路径中放置两个反斜杠而不是一个,即使在 MySQL 中也是如此

此外,我还必须按照@CompuChip 的提示正确构建我的请求。

感谢大家的帮助!

【讨论】:

以上是关于将字符串与数据库中的字符串进行比较返回 false的主要内容,如果未能解决你的问题,请参考以下文章

isEqualToString 总是返回 False

Python:将空字符串与 False 进行比较是 False,为啥?

如果将字符串与整数进行比较,它会评估为false吗?

将 data.table 列与数值列中的 NA 进行比较

Python:将空字符串与False进行比较是假的,为什么?

将字符串与字符序列进行比较