The*_*iot 3 mysql encoding character-encoding
每当我尝试保存ñ它就会变成?mysql数据库.经过一些阅读后,建议我必须将我的jsp字符集更改为UTF-8.由于某些原因,我必须坚持ISO-8859-1.我的数据库表编码是latin1.我怎样才能解决这个问题?请帮忙.
您在问题中声明您需要ISO-8859-1后端(latin1)和Unicode(UTF-8)前端.这种设置很疯狂,因为前端的设置远大于数据库中允许的设置.最安全的事情是通过软件堆栈使用相同的编码,但仅使用Unicode进行存储是有意义的.
正如您应该知道的,String是一系列字符的人类概念.在计算机程序中,字符串不是:它可以被视为一系列字符,但它实际上是一对数据结构:字节流和编码.
一旦你明白传递一个字符串真的是传递字节和一个方案,让我们看看谁发送了什么:
Content-Type.如果缺少,服务器将根据自己的策略选择一个,例如默认为ISO-8859-1或配置参数)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版本)