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

JSP 連接 MySQL:欄位名稱大小寫敏感度差異解析(JSP vs Java 控制台)

     編輯:程式設計綜合問答

現象描述

資料表欄位為大寫 NAME、CODE、ID。JSP 頁面中:

  • rst.getString("NAME") → 瀏覽器無資料
  • rst.getString("name") → 正常顯示

但 Java 控制台程式中,大小寫皆可正常取得資料。

根因分析

MySQL 欄位名稱大小寫規則

  • Linux/Unix:區分大小寫(預設 lower_case_table_names=0)
  • Windows:不區分大小寫(預設 lower_case_table_names=1)
  • macOS:不區分大小寫(預設 lower_case_table_names=2,儲存按原大小寫但比較不敏感)

JDBC 驅動程式行為差異

環境驅動版本ResultSet.getString() 行為
JSP (Tomcat + JDBC)較新版 (5.1.38+ / 8.0+)嚴格區分大小寫,需與資料庫中繼資料完全一致
Java 控制台較舊版或相同版但不同配置可能內部正規化為小寫,或 ResultSetMetaData 回傳小寫

關鍵點:ResultSetMetaData.getColumnLabel() vs getColumnName()

  • getColumnName():回傳資料庫定義的原始欄位名(保留大小寫)
  • getColumnLabel():回傳別名或標籤,某些驅動會正規化
  • JDBC 規範建議使用 getColumnLabel(),但實作不一

驗證方法

ResultSetMetaData meta = rst.getMetaData();
for (int i = 1; i <= meta.getColumnCount(); i++) {
    System.out.println("Column " + i + ": name=" + meta.getColumnName(i) 
        + ", label=" + meta.getColumnLabel(i));
}

在 JSP 與 Java 控制台分別執行,比較輸出差異。

最佳實務建議

  1. 統一使用小寫欄位名:建表時用 name、code、id,程式碼全用小寫,跨平台零困擾
  2. 若必須用大寫:JSP 中嚴格對應大寫 "NAME",並在連線字串加 useColumnNamesInFindColumn=true(MySQL Connector/J 8.0+)
  3. 使用 ORM 框架:Hibernate/MyBatis 映射實體類屬性,隔離大小寫差異
  4. 資料庫設定統一:生產環境 Linux 建議設 lower_case_table_names=1 強制不敏感(需重啟且影響現有表)

總結

JSP 與 Java 控制台大小寫行為不一,源於JDBC 驅動版本/配置差異導致 ResultSetMetaData 回傳值不同。根治之道是資料庫層面統一小寫命名慣例,應用層同步調整,徹底消除跨環境移植風險。

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