亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

Java/Sql-server 參數綁定沒有按預期工作

Java/Sql-server 參數綁定沒有按預期工作

慕仙森 2023-02-23 14:37:24
我們注意到我們的應用程序中有一個關于綁定參數的奇怪行為。我們使用帶有 JDBC 的 Java 連接到 Sql Server 數據庫。在表格單元格中,我們有值“μ”,我們將其與綁定參數進行比較,綁定參數也設置為值“μ”?,F在,在像“... where value !=?”這樣的 sql 語句中 , 其中 'value' 是數據庫中 'μ' 的值, ? 綁定變量也設置為“μ”,我們注意到我們得到了一條記錄,盡管我們希望“μ”等于“μ”。我們用來填充綁定參數的方法是java.sql.PreparedStatement.setString(int, String)。一些事實:μ在不同編碼下的字符值為:ASCII (ISO-8859-1) : 0xB5UTF-8 : 0xC2B5UTF-16 (= Java) : 0x00B5現在我做了一些調查,看看數據庫實際看到了哪些字節。因此,我嘗試了這樣的 sql 語句:select convert(VARBINARY(MAX), value), --  selects μ from database table       convert(VARBINARY(MAX), N'μ'),  --  selects μ from literal       convert(VARBINARY(MAX), ?)      --  selects μ from bind parameterfrom ...三個值的結果是:B500B500C200B500     <-- Here is the problem!因此,數據庫中 μ 的內部表示和 NVARCHAR 文字是 B500?,F在我們無法理解這里發生了什么。我們在 Java 變量中有“μ”的值(內部應該是 0x00B5)。當它作為綁定變量傳遞時,似乎被轉換為 UTF-8(這使得字節序列為 0xC2B5),然后數據庫將其視為兩個字符,從而使字符序列 C200B500。讓事情變得更加混亂:(1) 在具有不同數據庫的另一臺機器上,相同的代碼按預期工作。三行的結果是 B500/B500/B500,因此綁定變量被轉換為正確的 B500。(2) 在同一臺機器上,相同的數據庫但不同的程序(但使用相同的 jdbc 驅動庫和相同的連接參數)這也按預期工作,給出 B500/B500/B500 的結果。一些額外的事實,也許它們很重要: 數據庫是 Sql Server 2014 Java 是 Java 7 有問題的應用程序是在 Tomcat 7 中運行的 webapp。Jdbc 庫是 sqljdbc 4.2非常感謝任何解決此問題的幫助!
查看完整描述

1 回答

?
楊魅力

TA貢獻1811條經驗 獲得超6個贊

我現在找到了解決方案。它與 Sql Server 或綁定完全沒有關系,而是......

默認情況下,Tomcat 7 不以 UTF-8 模式運行(我不知道這一點)。我們談論的 μ 來自另一個通過網絡服務調用提供此值的應用程序。但是,應用程序默認使用 UTF-8。因此,它發送了一個 UTF-8 μ,但 Web 服務并不期望 UTF-8 并認為它是兩個字符,并像這樣處理它們,用 0xC2 和 0xB5 的字符填充內部 String 變量(這是,對于 SQL Server,C200B500)。


查看完整回答
反對 回復 2023-02-23
  • 1 回答
  • 0 關注
  • 86 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號