如何在SQL中实现字符串的大小写敏感绝对比较?
解决SQL Server字符串大小写敏感匹配问题
问题根源
SQL Server默认使用的排序规则(比如SQL_Latin1_General_CP1_CI_AS)是**不区分大小写(CI)**的,所以查询时会把"Abc"和"abc"判定为相等,无法实现你要的绝对匹配。
解决方案
方案1:查询时指定区分大小写的排序规则(推荐,不影响现有业务)
在UserName的比较条件后加上COLLATE SQL_Latin1_General_CP1_CS_AS,强制区分大小写。同时必须改用参数化查询,避免SQL注入风险(你的原代码直接拼接字符串存在严重安全隐患)。
修改后的VB代码:
Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click Dim Usr As String = TextBox1.Text.Trim Dim Pwd As String = TextBox2.Text.Trim Dim i As Integer ' 使用参数化查询,同时指定区分大小写的排序规则 user_stmt = "Select Count(*) from UserTable where UserName = @Usr COLLATE SQL_Latin1_General_CP1_CS_AS and Password = @Pwd" User_Cmd = New SqlCommand(user_stmt, con) ' 添加参数,避免SQL注入 User_Cmd.Parameters.AddWithValue("@Usr", Usr) User_Cmd.Parameters.AddWithValue("@Pwd", Pwd) con.Open() i = CInt(User_Cmd.ExecuteScalar()) con.Close() ' 记得关闭连接,也可以用Using语句自动释放资源 If i = 1 Then MsgBox("Found") Else MsgBox("Exit") End If End Sub
方案2:修改字段的排序规则(需谨慎评估)
如果你的业务全局需要UserName区分大小写,可以直接修改UserTable中UserName字段的排序规则为区分大小写的类型:
ALTER TABLE UserTable ALTER COLUMN UserName VARCHAR(50) COLLATE SQL_Latin1_General_CP1_CS_AS NOT NULL;
注意:修改字段排序规则会锁表,且可能影响依赖该字段的其他查询,操作前务必备份数据并评估业务影响。
额外提醒
永远不要直接拼接用户输入到SQL语句中,这会导致SQL注入攻击,参数化查询是必须的安全实践。
内容的提问来源于stack exchange,提问作者MGC
相关产品推荐
相关产品推荐

