首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

Hibernate Criteria 查詢不分大小寫?MySQL utf8_general_ci 排序規則導致,改用 utf8_bin 或 Criteria 指定區分大小寫

     編輯:程式設計疑難解答

使用 Hibernate Criteria 查詢 `username`、`password` 時,輸入 `zhangsan`/`123` 仍能查到資料庫儲存的 `ZhangSan`/`123`,原因是 MySQL 資料表/欄位採用 **`utf8_general_ci`(ci = case-insensitive)排序規則**,導致比較預設不分大小寫。

解決方案

方案一:修改欄位排序規則為區分大小寫(推薦,資料層面徹底解決)


ALTER TABLE `user` MODIFY `username` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin;
ALTER TABLE `user` MODIFY `password` VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_bin;

`utf8_bin` 二進位比較,嚴格區分大小寫。

方案二:HQL/Criteria 指定區分大小寫(不改資料庫結構)


// HQL
from User where binary username = :name and binary password = :pwd

// Criteria (Hibernate 5.2+)
criteria.add(Restrictions.eq("username", username).ignoreCase(false));
// 或
criteria.add(Restrictions.sqlRestriction("binary username = ?", username, StandardBasicTypes.STRING));

方案三:應用層驗證(最後防線)

查詢回傳實體後,在 Java 代碼中用 `equals` 再次比對密碼,雙重保險。

建議

**資料庫層面改 `utf8_bin` 最乾淨**,避免應用層到處加 `binary` 或 `ignoreCase(false)`,且能統一規範所有查詢行為。修改前請評估現有資料是否有大小寫衝突(如 `Admin` vs `admin`),若有需先清理資料。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved