mysql - 如何保存 -

The*_*iot 3 mysql encoding character-encoding

每当我尝试保存ñ它就会变成?mysql数据库.经过一些阅读后,建议我必须将我的jsp字符集更改为UTF-8.由于某些原因,我必须坚持ISO-8859-1.我的数据库表编码是latin1.我怎样才能解决这个问题?请帮忙.

mra*_*888 5

MySQL WorkBench例如,转到数据库管理,将引擎放入InnoDB和排序utf8-utf8_general_ci.


Raf*_*ele 5

您在问题中声明您需要ISO-8859-1后端(latin1)和Unicode(UTF-8)前端.这种设置很疯狂,因为前端的设置远大于数据库中允许的设置.最安全的事情是通过软件堆栈使用相同的编码,但仅使用Unicode进行存储是有意义的.

正如您应该知道的,String是一系列字符的人类概念.在计算机程序中,字符串不是:它可以被视为一系列字符,但它实际上是一对数据结构:字节流和编码.

一旦你明白传递一个字符串真的是传递字节和一个方案,让我们看看谁发送了什么:

  1. 浏览器到HTTP服务器(通常与表单页面编码相同,因此UTF-8.方案是通过指定的Content-Type.如果缺少,服务器将根据自己的策略选择一个,例如默认为ISO-8859-1或配置参数)
  2. HTTP Server到Java程序(它是Java到Java,因此编码无关紧要,因为我们传递了String对象)
  3. Java客户端到MySQL服务器(Connector/J文档非常复杂 - 它使用character_set_server系统变量,可能被characterEncoding连接参数覆盖)

要了解问题所在,首先要确保列实际存储为latin1:

SELECT character_set_name, collation_name
    FROM information_schema.columns
    WHERE table_schema = :DATABASE
        AND table_name = :TABLE
        AND column_name = :COLUMN;
Run Code Online (Sandbox Code Playgroud)

然后将从请求中获得的Java字符串写入日志文件:

logger.info(request.getParameter("word"));
Run Code Online (Sandbox Code Playgroud)

最后看看列中的实际内容:

SELECT HEX(:column) FROM :table
Run Code Online (Sandbox Code Playgroud)

此时,您将获得足够的信息来理解问题.如果它真的是一个问号(而不是替换字符),可能是MySQL试图将一个字符从一个较大的集合(比如说Unicode)转码为一个不包含它的较窄的字符.这里奇怪的是ñ属于 ISO-8859-1(0xF1,十进制241)和Unicode(U + 00F1),所以看起来有一个第三个字符集(可能是一个代码页?)参与往返.

更多信息可能有所帮助(操作系统,HTTP服务器,MySQL版本)