Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
String 字符串数据流,编码和解码从浏览器到mysql数据库,反之亦然_String_Character Encoding - Fatal编程技术网

String 字符串数据流,编码和解码从浏览器到mysql数据库,反之亦然

String 字符串数据流,编码和解码从浏览器到mysql数据库,反之亦然,string,character-encoding,String,Character Encoding,用户在浏览器上输入的html表单中插入字符串。此字符串保存在数据库中。如何在基于字符编码的每个阶段对该字符串进行编码和解码 按照使用的技术堆栈流动:浏览器-->ajax post-->spring mvc-->hibernate-->mysql db您可以预期浏览器post是URL编码的UTF-8。在JavaJVM中,字符串使用UTF-16,因此,如果是英文文本,则其大小大致翻了一番。Hibernate就是其中的一部分,它并不真正关心编码,尽管它确实使用连接字符串传递,如下所述(Hibernat

用户在浏览器上输入的html表单中插入字符串。此字符串保存在数据库中。如何在基于字符编码的每个阶段对该字符串进行编码和解码


按照使用的技术堆栈流动:浏览器-->ajax post-->spring mvc-->hibernate-->mysql db

您可以预期浏览器post是URL编码的UTF-8。在JavaJVM中,字符串使用UTF-16,因此,如果是英文文本,则其大小大致翻了一番。Hibernate就是其中的一部分,它并不真正关心编码,尽管它确实使用连接字符串传递,如下所述(
Hibernate.connection.url
property)

然后,UTF-16字符串由JDBC驱动程序翻译,对于MySQL,JDBC驱动程序将在连接字符串中使用
characterEncoding
属性。如果这与
CREATE database
语句中声明的数据库编码匹配,则会有帮助,从而避免再次重新编码

最后,“latin”不是特定字符集或编码的名称。你可能是指ISO 8859-1,也称为拉丁语-1。对于web服务器来说,这不是一个好的选择,因为它不能表示大多数非英语字符串。您应该在数据库和连接字符串中使用UTF-8,最后使用UTF-8->UTF-16->UTF-8,这是一个安全且合理有效的序列(不包括浏览器本身可能发生的任何编码)


如果您决定将数据库更改为使用UTF-8,那么也要注意在表级别更改编码。每个表都可以使用自己的编码,并且不会自动更改。

Q:是什么让您认为有任何隐式编码/解码正在进行?我们可以在MySQL上指定字符编码。假设我指定拉丁语。那么编码和解码是如何在这一层发生的呢。Html表单可以使用application/x-www-form-urlencoded提交数据,spring mvc是否在将值转换为java控制器代码之前对其进行解码?谢谢您的精彩回答。我理解你不使用拉丁语-1的原因。但假设db具有字符编码拉丁1。在本例中,JDBC驱动程序将Java UTF-16字符转换为拉丁语-1编码并传递到数据库。这是否意味着hibernate连接url上指定的编码应该与MySQL服务器上定义的字符编码相同?@SanjeevKumarDangi-JDBC驱动程序通常能够从数据库中自动检测编码。如果您想覆盖连接字符串中的自动检测,那么是的,我希望您会尝试匹配数据库服务器使用的编码,以尽量减少某种数据丢失。例如,如果数据库使用与其中相关表不同的编码,则可能需要强制使用与表匹配的编码。