2012-01-13 53 views
4

比較UTF8文字MySQL查詢我有一個問題,而從表中使用Java方含UTF8格式數據在MySQL中選擇,該WHERE子句中我需要某列的值等於一個java比較字符串,但不符合如何使用Java

"Select age from student where name = '"+stringVariable+"';" 

的stringVariable有時會在阿拉伯所以在這種情況下,他們不符合

數據庫是utf8mb4和Java和數據庫之間的連接也是UTF_8和我插入或僅選擇數據時不存在問題,但在比較時發生問題

我試圖將字符串轉換這樣,它也didnt比賽

byte[] b = stringVariable.getBytes("UTF-8"); 
String str = new String(b,"UTF-8"); 

所以任何人有任何解決辦法?!

謝謝您提前

+2

你展示作爲例子可能會做任何的轉換:要在編碼成UTF-8和解碼來自UTF-8。 – jjmontes 2012-01-13 14:06:20

回答

6

使用參數。然後驅動程序應該根據連接屬性正確編碼它們。

PreparedStatement statement = connection.prepareStatement(
    "select age from student where name = ?");  
statement.setString(1, stringVariable); 

此外,這也正確地轉義特殊的SQL字符(如單引號)。

+0

感謝你的幫助,但我想它和它沒有工作,例如當我試過了這個例子 字符串stringVariable =「阿米娜」; PreparedStatement的聲明=各種Connection.prepareStatement( 「從學生時代選擇其中名稱=?」); statement.setString(1,stringVariable); 結果集爲空,但是當我嘗試用它工作正常的字符串,所以你有什麼想法,爲什麼這仍然是怎麼回事? – sabty 2012-01-13 15:40:40

+0

您的排序規則是utf8_unicode_ci還是utf8_unicode_cs(這是違規行爲)? – jjmontes 2012-01-17 19:33:02

+0

我的整理是utf8mb4_unicode_ci現在它正在使用準備好的聲明非常感謝你。我知道這個問題,它不僅涉及到數據庫查詢和我張貼 – sabty 2012-01-18 09:33:28

3

你不應該有任何改變。司機照顧一切。嘗試使用prepared statement而不是字符串連接。這將具有避免SQL injection attacks的額外優勢,並確保您的語句即使字符串變量包含引號也能正常工作。

+0

謝謝,但我試圖用準備好的語句,問題仍然存在,那麼你有什麼想法,爲什麼?! – sabty 2012-01-13 15:57:39

+0

如果它們不匹配,可能是因爲它們不是相同的字符串。嘗試做一個測試,插入一些阿拉伯字符串,然後使用相同的字符串實例和準備的語句進行搜索。 – 2012-01-13 16:01:00

+0

是的,他們是不同的,我也試過你說的插入和選擇什麼和它的工作所以這意味着仍然有編碼的一個問題,但我不知道如何在Java字符串轉換爲UTF-8,以匹配一個數據庫或者如果還有其他問題 – sabty 2012-01-13 16:16:11

1

我解決了這個問題,它不僅與數據庫查詢有關,但我從Ajax請求字符串,所以我不得不把它從UTF8先解碼,然後獲得使用

URLDecoder.decode(request.getQueryString(), "UTF-8") 

,然後參數值它傳遞給查詢和我根據連接屬性,正如你所說

使用編碼它準備好的聲明中感謝您