2013-04-30 17 views
1

在Java中,我將String傳遞給PHP。處理從Java到PHP到MySQL的字符編碼

在PHP中,我接受該字符串並使用MySQL查詢進行搜索。

這裏是PHP代碼:

$query = $database->escape_value(trim($_POST['query'])); 
    $result = mysqli_query($dbconnection, Data::getSearchQuery($query)); 
    while ($row = mysqli_fetch_assoc($result)) { 
     $output[] = $row; 
    } 
    print(json_encode($output)); 

    mysqli_close($dbconnection); 


    public static function getSearchQuery($item_query) { 

     $query = " 
      SELECT i.item, i.item_id, c.category, c.cat_id 
      FROM items as i 
      LEFT JOIN master_cat AS c 
        ON (c.cat_id = i.cat_id) 
      WHERE i.item LIKE '%{$item_query}%' 

      ORDER BY i.item ASC;"; 

     return $query; 
    } 

,如果我在我的美國鍵盤上使用常規字符這始終有效。但是當我開始使用不規則字符時,搜索變爲空白。

我可以驗證MySQL存儲數據作爲用戶輸入它。所以如果他們輸入Beyoncè,那就是數據庫存儲它的方式。

但是,當我在上面的代碼中搜索Beyoncè(或其他)時,它將返回空。

我應該如何處理字符。編碼在這裏?

+0

你應該使用存儲過程,而不是你的php代碼中的SQL,如果你不小心可以允許sql注入攻擊 – Patashu 2013-04-30 23:42:52

回答

1

三點想:

1)$item_query變量可以派上錯誤的編碼。

2)>>我可以驗證的MySQL存儲數據在用戶輸入IT

這可能很麻煩。如果將一個iso8859-1編碼的字符串寫入utf-8數據庫,字符串顯然存儲不正確。如果使用配置爲iso8859-1的客戶端(即phpmyadmin或mysql命令行工具)讀取該字符串,則該字符串會正確返回 - 儘管其在數據庫中的表示顯然是錯誤的。

3)MySql設置: 爲連接本身設置了utf-8嗎?怎麼樣的數據庫/表格的字符集和排序?

https://dev.mysql.com/doc/refman/5.5/en/charset-syntax.html

UPDATE: 我假設你想要的一切是UTF-8。快速劈的實物測試:

  • Beyoncé具有7個字符(參見MySQL的CHAR_LENGTH函數)
  • 在UTF-8,它佔據8個字節(參照MySQL的LENGTH功能)。這八個字節用像windows-1252這樣的每字節一個字節編碼表示,如Beyoncé

這導致以下診斷測試...

  1. 的PHP發行的SQL命令

    "SELECT CHAR_LENGTH($item_query), LENGTH($item_query);" 
    

    那麼應該返回的結果是(7,8)向我們展示$ item_query變量可能是正確編碼的,並且數據庫類似於UTF-8。 (7,7)意味着$ item_query不是UTF-8,並且(8,8)意味着數據庫不想處理UTF-8。如果後者是這種情況,那麼可能在查詢之前發出SET NAMES 'UTF8';

  2. 同樣,PHP發行的SQL命令

    SELECT CHAR_LENGTH('Beyoncé'), LENGTH('Beyoncé'); 
    

    應該返回的結果(7,8)向我們表明你的PHP編輯器配置編輯UTF-8 PHP文件

  3. 用phpmyadmin(或任何SQL客戶端)重複上一步,以確保該客戶端使用UTF-8也是

  4. 尚未涉及表格! SQL命令

    SELECT CHAR_LENGTH(somecolumn), LENGTH(somecolumn) FROM sometable; 
    

    (與sometable具有UTF-8字符編碼和somecolumn含有一些變音字符)應該告訴你如果UTF-8存儲的值表中當使用。

  5. 如果所有以前的測試都通過了,再次用LIKE測試。即使'Beyoncé' LIKE 'Beyonce'應該工作。有關更多信息,請參閱Google MySQL歸類。

+0

String來自Java。它不是專門設置爲Java或PHP中的編碼類型。另外,我通過'phpmyadmin'驗證了這一點。那麼也許那對你沒有幫助?我的排序規則在所有「MySQL」表中都設置爲「utf_general_ci」。 – KickingLettuce 2013-05-01 19:13:08

+1

請在上面的更新中看到我的建議。 – fjf2002 2013-05-01 19:57:38

+0

謝謝!非常徹底。我可以測試後讓我回到你身邊。 – KickingLettuce 2013-05-01 20:12:09