【问题标题】:Character Encoding JDBC MySQL字符编码 JDBC MySQL
【发布时间】:2012-08-11 15:09:10
【问题描述】:

我有一个多语言 java 应用程序,它可以在 MySql 数据库中获取和存储数据。

我将表格排序规则保留为 utf-8-general-ci

对于 JDBC 连接,我使用 useUnicode=true&characterEncoding=UTF-8 参数。

像 ® 这样的字符可以正常显示,但中文字符会乱码。

现在

关于添加JVM参数-Dfile.encoding=UTF8

显示中文字符,但不显示 ® 等字符。

我应该怎么做才能显示来自不同语言输入的所有字符。

编辑:

输入数据来自 UDP 数据包,由 ByteBuffer 上的 get 方法处理。

还有一个像这样实现的 getString 方法。

public String getString() {
    byte[] remainingBytes = new byte[this.byteBuffer.remaining()];
    this.byteBuffer.slice().get(remainingBytes);
    String dataString = new String(remainingBytes);
    int stringEnd = dataString.indexOf(0);

    if(stringEnd == -1) {
        return null;
    } else {
        dataString = dataString.substring(0, stringEnd);
        this.byteBuffer.position(this.byteBuffer.position() + dataString.getBytes().length + 1);

        return dataString;
    }
}

【问题讨论】:

  • 你想在哪里展示东西?目前还不清楚这个问题是否真的与数据库有关。
  • 我在一个 PHP 网页上显示它,从那个 mysql DB 获取数据
  • 好的,这是另一个很容易出错的方面。你做了什么来说服自己问题出在 Java 代码而不是 PHP 上?
  • 因为在 JDBC 中仅使用 useUnicode=true&characterEncoding=UTF-8 时会显示类似 ® 的字符,但在 JVM 参数中添加 -Dfile.encoding=UTF8 时会停止正确显示。
  • 当我复制粘贴中文/数据库中的任何字符时,它会正确显示。所以问题出在 JAVA -> DB path

标签: java mysql jdbc character-encoding


【解决方案1】:

当您直接在 MYSQL 中尝试该字符时,您声明它有效,只有当 java 将它放在那里时,它才不正确。

尝试让您的代码查找这些字符并将它们转储到文本文件或转储到 std 以进行简短测试,以比较文本 std 输出与发送到 db 的内容?

还值得存储数据库事务以查看发送的内容:

就 mysql 配置而言,确保您的表和 mysql 本身以 utf-8 模式运行:

[client]
default-character-set=utf8

# This was formally known as [safe_mysqld]. Both versions are currently parsed.
[mysqld_safe]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci
init-connect='SET NAMES utf8'

[mysqld]
default-character-set=utf8
default-collation=utf8_general_ci
character-set-server=utf8
collation-server=utf8_general_ci

确保上面已经放入/etc/mysql/my.cnf 对于您在下面运行的每个数据库名称,以使其转储表并在每个表中添加一条更改行以转换为 utf8

select CONCAT("Alter Table `",  i.TABLE_NAME, "` CONVERT TO CHARACTER SET utf8;") as MySQLCMD from information_schema.TABLES i where i.TABLE_SCHEMA =
"userbase" INTO OUTFILE '/tmp/userbase.csv' ;

其他值得尝试的事情 - 特别是如果它在此服务器上以 utf-8 编写:

  1. Linux系统环境:

    Unix 语言环境 语言环境

    LANG=en_GB.UTF-8 LC_CTYPE="en_GB.UTF-8" LC_NUMERIC="en_GB.UTF-8" LC_TIME="en_GB.UTF-8" LC_COLLATE="en_GB.UTF-8" LC_MONETARY="en_GB.UTF-8" LC_MESSAGES="en_GB.UTF-8" LC_PAPER="en_GB.UTF-8" LC_NAME="en_GB.UTF-8" LC_ADDRESS="en_GB.UTF-8" LC_TELEPHONE="en_GB.UTF-8" LC_MEASUREMENT="en_GB.UTF-8" LC_IDENTIFICATION="en_GB.UTF-8" LC_ALL=

解决这个问题

 sudo dpkg-reconfigure locales    select en_GB.UTF-8
 update-locale LANG=en_GB.UTF-8

服务的重新启动框以获取 utf-8 作为您需要的用户 完全注销并重新登录并在重新启动前检查语言环境以确保 它的工作。

这意味着您现在可以在本地 ssh 上输入日语(如果使用 putty 在设置中需要选择utf-8)

  1. 雄猫: 添加 URIEncoding="UTF-8" 到

我也加了

 <Connector port="8009"......
           protocol="AJP/1.3"  URIEncoding="UTF-8" />

3.2 在本地站点的 web.xml 中(在 WEB-INF 内) web.xml(不确定是否 这是必不可少的)

<web-app>
    <filter>
        <filter-name>charsetFilter</filter-name>
        <filter-class>filters.SetCharacterEncodingFilter</filter-class>
        <init-param>
            <param-name>encoding</param-name>
            <param-value>UTF-8</param-value>
        </init-param>
    </filter>

然后查找映射并添加:

 <!-- Define filter mappings for the defined filters -->
<filter-mapping>
<filter-name>charsetFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>

我遇到了值得在一个好的 utf-8 编辑器(notepad++ 带有启用 utf-8 的选项)或 kate 或 kde 上的其他东西中打开保存和查看 udp 字符串的特定字符损坏问题。

还可以通过标准输出或文件上的文件测试出不同的 utf-8 字符,那些可以工作的字符和那些可能不工作的字符

http://www.fileformat.info/info/unicode/char/search.htm

并确保字符相同 http://www.fileformat.info/info/unicode/char/00ae/index.htm

【讨论】:

    猜你喜欢
    • 2013-04-26
    • 2011-03-03
    • 2016-08-10
    • 1970-01-01
    • 2013-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多