Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/329.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
Java 字符编码JDBCMySQL_Java_Mysql_Jdbc_Character Encoding - Fatal编程技术网

Java 字符编码JDBCMySQL

Java 字符编码JDBCMySQL,java,mysql,jdbc,character-encoding,Java,Mysql,Jdbc,Character Encoding,我有一个多语言java应用程序,它在MySql数据库中获取和存储数据 我将表格排序保留为utf-8-general-ci 对于JDBC连接,我使用useUnicode=true&characterEncoding=UTF-8参数 像®这样的字符可以正确显示,但中文字符却乱七八糟 现在 在添加JVM参数时-Dfile.encoding=UTF8 显示中文字符,但不显示类似®的字符 我应该如何显示来自不同语言的输入中的所有字符 编辑: 输入数据来自UDP数据包,该数据包由ByteBuffer上的ge

我有一个多语言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;
    }
}

当您直接在MYSQL中尝试该字符时,您会声明它是有效的,只有当java将其放在MYSQL中时,它才是不正确的

尝试让您的代码查找这些字符,并将它们转储到文本文件或输出到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 对于下面运行的每个DB名称,将其转储到表中,并为每个表添加一个alter行以转换为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编写:

  • 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” 立法会全体议员=

  • 要解决这个问题

     sudo dpkg-reconfigure locales    select en_GB.UTF-8
     update-locale LANG=en_GB.UTF-8
    
    “重新启动”框,以便服务以您需要的用户身份接收utf-8 完全注销并重新登录,并在重新启动前检查区域设置,以确保 它起作用了

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

  • Tomcat: 将URIEncoding=“UTF-8”添加到 我还添加了

     <Connector port="8009"......
               protocol="AJP/1.3"  URIEncoding="UTF-8" />
    
    
    
    3.2 在web.xml中,对于本地站点(在web-INF中)web.xml(不确定是否 这是必要的)

    
    字符集过滤器
    filters.SetCharacterEncodingFilter
    编码
    UTF-8
    
    然后查找映射并添加:

     <!-- 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的选项)或kde上的kate或其他东西中打开保存和查看udp字符串

    还可以通过std out或file on测试不同的utf-8字符,即可以工作的字符和可能不工作的字符

    并确保字符相同

    您想在哪里显示东西?现在还不清楚这个问题是否真的与数据库有关。我将它显示在一个PHP网页上,从mysql数据库中获取数据。好吧,这是很容易出错的另一个方面。你做了什么来说服自己问题出在Java代码而不是PHP中?因为在JDBC中只使用useUnicode=true&characterEncoding=UTF-8时,它会像®一样显示字符,但在JVM参数中添加-Dfile.encoding=UTF8时,它会停止正确显示。当我复制粘贴中文/数据库中的任何字符时,它会正确显示。所以问题出在JAVA->DB路径中
     <!-- Define filter mappings for the defined filters -->
    <filter-mapping>
    <filter-name>charsetFilter</filter-name>
    <url-pattern>/*</url-pattern>
    </filter-mapping>