如何在 sql 中比较两个字符串值 Absolute?

How do I compare two string value Absolutely in sql?

提问人:MGC 提问时间:10/2/2023 最后编辑:jmcilhinneyMGC 更新时间:10/2/2023 访问量:72

问:

我试图弄清楚如何比较两个字符串值以获得绝对匹配。即“abc”<>“abc”。

“abc”在 SQL(Usr) 中的一行中,“abc”是变量值。

当我运行这个 - “从UserTable中选择Count(*),其中UserName = '” &Usr &“'” &“ and Password = '” & Pwd & “'” - 它告诉我这两个值是相同的。

我不知道如何获得绝对比较??

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   Dim Usr As String, Pwd As String
   
   Usr = TextBox1.Text.Trim
   Pwd = TextBox2.Text.Trim
   
   Dim i As Integer

   user_stmt = "Select Count(*) from UserTable where UserName = '" & Usr & "'" & " and Password = '"        & Pwd & "'"

   User_Cmd = New SqlCommand(user_stmt, con)
  
   con.Open()

   i = User_Cmd.ExecuteScalar()

   Stop

   If i = 1 Then
      MsgBox("Found")
   Else
      MsgBox("Exit")
   End If
End Sub

谢谢

话筒

SQL 比较

评论

1赞 jarlh 10/2/2023
这取决于使用的排序规则。您使用的是哪种 dbms?
1赞 Tim Schmelter 10/2/2023
不要使用字符串串联来构建 sql 字符串,使用参数化查询来防止 sql 注入和其他问题(特别是如果你的参数来自用户输入,就像这里一样)。另外:不要将密码存储为纯文本,而是对其进行加密。
0赞 jmcilhinney 10/2/2023
如果你问如何在SQL中做某事,那么应用程序语言是无关紧要的。无论如何,您使用的 SQL 都是相同的。

答:

1赞 AlgorithmAlchemist 10/2/2023 #1

在代码中,有几件非常重要的事情需要考虑和纠正:

SQL注入风险:

您的代码容易受到 SQL 注入攻击。切勿将字符串值直接连接到 SQL 语句中。请改用参数化查询。

SQL 中的区分大小写:

如果要区分大小写比较,则需要通过将 COLLATE Latin1_General_BIN附加到比较中来强制进行二进制比较。

存储密码:

不要在数据库中存储纯文本密码。始终存储密码的加盐哈希并比较哈希。纯文本密码存储存在严重的安全风险。

以下是您的问题的潜在解决方案:(没有使用盐进行哈希处理,但您可以轻松找到适合您的函数)

Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
   Dim Usr As String, Pwd As String
   
   Usr = TextBox1.Text.Trim
   Pwd = TextBox2.Text.Trim
   
   Dim i As Integer

   user_stmt = "SELECT Count(*) FROM UserTable WHERE UserName COLLATE Latin1_General_CS_AS = @UserName AND Password COLLATE Latin1_General_CS_AS = @Password"

   User_Cmd = New SqlCommand(user_stmt, con)
   User_Cmd.Parameters.AddWithValue("@UserName", Usr)
   User_Cmd.Parameters.AddWithValue("@Password", Pwd)
  
   con.Open()

   i = User_Cmd.ExecuteScalar()

   con.Close()

   If i = 1 Then
      MsgBox("Found")
   Else
      MsgBox("Exit")
   End If
End Sub

评论

0赞 MGC 10/2/2023
感谢您的帮助;非常感谢。
0赞 jarlh 10/2/2023
请注意,Latin1_General_BIN是特定于产品的排序规则 - 对于未指定的 dbms...