2012-06-17 24 views
0

用戶在瀏覽器上的html表單輸入中插入一個字符串。該字符串保存在數據庫中。這個字符串是如何在每個階段基於字符編碼進行編碼和解碼的?從瀏覽器到mysql數據庫進行編碼和解碼的字符串數據流(反之亦然)

流量按技術組合使用:瀏覽器 - > AJAX後 - > Spring MVC的 - >休眠 - > MySQL數據庫

+0

問:什麼讓你覺得有*隱式編碼/解碼正在完成? – paulsm4

+0

我們可以在MySQL上指定一個字符編碼。假設我指定拉丁文。那麼編碼和解碼如何在該層發生。 Html表單可以使用application/x-www-form-urlencoded提交數據,spring是否會在將它們傳遞給java控制器代碼之前解碼這些值? –

回答

0

可以預計的是,瀏覽器後是UTF-8編碼的URL。在Java JVM中,該字符串使用UTF-16,因此如果它是英文文本,則其大小大致加倍。 Hibernate是其中的一部分,它並不關心編碼,雖然它會傳遞下面描述的連接字符串(hibernate.connection.url屬性)。

UTF-16字符串然後由JDBC驅動程序進行翻譯,如果是MySQL,將使用連接字符串內的characterEncoding屬性。如果它匹配在CREATE DATABASE語句中聲明的數據庫的編碼,它將有所幫助,從而避免重新編碼。

最後,「拉丁」不是特定字符集或編碼的名稱。您可能意指ISO 8859-1,也被稱爲Latin-1。這對於Web服務器來說不是一個好的選擇,因爲它不能代表大部分非英文字符串。您應該在數據庫和連接字符串中使用UTF-8,最後以UTF-8 - > UTF-16 - > UTF-8結尾,這是一個安全且合理高效的序列(不包括可能發生在瀏覽器本身)。

如果您決定更改數據庫以使用UTF-8,請注意也可以在表級別更改編碼。每個表格可以使用自己的編碼,並且不會自動更改。

+0

感謝這個美好的回答。我瞭解你不使用latin-1的原因。但假設db有字符編碼latin1。在這種情況下,JDBC驅動程序會將Java UTF-16字符轉換爲latin-1編碼並傳遞到數據庫。這是否意味着在hibernate連接url上指定的編碼應該與在MySQL服務器上定義的字符編碼相同? –

+0

@SanjeevKumarDangi - JDBC驅動程序通常能夠自動檢測數據庫中的編碼。如果你想在連接字符串中覆蓋這個自動檢測,那麼是的,我希望你會嘗試匹配數據庫服務器使用的編碼,以最大限度地減少某種數據丟失。例如,如果數據庫使用與其中相關表不同的編碼,則可能需要強制與表匹配的編碼。 –

相關問題