繁体   English   中英

DB2使用ALT_COLLATE UNICODE在非Unicode数据库上插入UTF-8字符

[英]DB2 insert UTF-8 characters on non unicode database with ALT_COLLATE UNICODE

我正在尝试在DB2数据库中插入中文文本,但无法正常工作。

默认情况下,数据库配置为ANSI(en_US 819)(这对于使用dame数据库的其他应用程序是必需的)。定义了ALT_COLLATE IDENTITY_16BIT,并使用CCSID UNICODE创建了UNICODE表,但未插入中文或韩文的Unicode字符。

表格示例:

CREATE TABLE LANGS (
    IDIOMA  char(2) NOT NULL,
    PAIS    char(2) NOT NULL,
    TRADUC  long varchar NOT NULL,
) CCSID UNICODE;

示例插入:

INSERT INTO LANGS (IDIOMA,PAIS,TRADUC) VALUES ('zh','TW','其他');

系统信息:

  • 服务器:Ubuntu 64位上的DB2 9.7(zh_CN)
  • 客户端:带有db2jcc.jar的Windows 7 32位(es_ES)Java 7

Java提取示例:

Class.forName("com.ibm.db2.jcc.DB2Driver");

...

Properties props = new Properties();
props.setProperty("user", user);
props.setProperty("password", pass);
props.setProperty("DB2CODEPAGE", "1208");
props.setProperty("retrieveMessagesFromServerOnGetMessage", "true");

con = DriverManager.getConnection(url, props);

...

Statement statement = con.createStatement();
statement.execute(sql);

...
statement.close();
con.close();

DB CFG取得

DB2数据库语言环境配置

Territorio de base de datos                             = en_US;
Página de códigos de base de datos                      = 819 
Conjunto de códigos de base de datos                    = iso8859-1 
Código de país/región de base de datos                  = 1 
Secuencia de clasificación de base de datos             = UNIQUE 
Orden de clasificación alternativo        (ALT_COLLATE) = IDENTITY_16BIT
Tamaño de página de base de datos                       = 4096

语句正确执行,并且行正确显示在数据库中,用于:

  • en_GB
  • zh_CN
  • es_ES
  • pt_PT

但不适用于:

  • cy_GB
  • ko_KR
  • zh_TW

从命令行使用db2cmd进行插入对于这种语言也不起作用(插入时只有1个字节。

在zh_TW 工作本地化的Linux环境中从命令行插入。 在Linux环境下的局部作为的en_US.UTF-8部作品命令行插入。

在这些环境中,切勿在Java上工作。


由于存在一些限制,因此不能选择使用“ X”作为VARCHAR字段的前缀,并且SQL可以在两种环境下工作。

我认为由于配置,文件或sql编码,这可能是客户端或服务器上的某些编码问题。


更新:

我也尝试用SQL加载UTF-8文件。 该文件将正确加载,并且将带有UTF-8字符的SQL调试正确传递给了Statement,但结果是相同的。

new InputStreamReader(new FileInputStream(file),"UTF-8")

...

private void executeLineByLine(Reader reader) throws SQLException {
    StringBuffer command = new StringBuffer();
    try {
        BufferedReader lineReader = new BufferedReader(reader);
        String line;
        while ((line = lineReader.readLine()) != null) {
            command = handleLine(command, line);
        }
        checkForMissingLineTerminator(command);
    } catch (Exception e) {
        String message = "Error executing: " + command + ".  Cause: " + e;
        printlnError(message);
        throw new SQLException(message, e);
    }
}


private StringBuffer handleLine(StringBuffer command, String line) throws SQLException, UnsupportedEncodingException {
    String trimmedLine = line.trim();
    if (lineIsComment(trimmedLine)) {
        println(trimmedLine);
    } else if (commandReadyToExecute(trimmedLine)) {
        command.append(line.substring(0, line.lastIndexOf(delimiter)));
        command.append(LINE_SEPARATOR);
        println(command);
        executeStatement(command.toString());
        command.setLength(0);
    } else if (trimmedLine.length() > 0) {
        command.append(line);
        command.append(LINE_SEPARATOR);
    }
    return command;
}

private void executeStatement(String command) throws SQLException, UnsupportedEncodingException {
    boolean hasResults = false;
    Statement statement = connection.createStatement();
    hasResults = statement.execute(command);
    printResults(statement, hasResults);
    statement.close();
}

更新2:

不能更改数据类型。 该数据库是其他系统的一部分,并且已经包含数据。

该数据库安装在7台不同的服务器上,其中3台使用Linux在UTF-8 shell中插入数据,并且已从db2命令行正确插入了数据。

从Windows db2命令行或使用Java,无法正确插入字符。

将Java源更改为UTF-8源可以使System.out正确打印SQL,就像我看到调试sql变量一样。

当我插入此测试SQL。 可以在System.out和Statement内部变量中正确显示中国字符

INSERT INTO LANGS (IDIOMA,PAIS,TRADUC) VALUES ('zh','TW','TEST1 其他 FIN TEST1');

但是在数据库中,测试显示为:

TEST3  FIN TEST3

十六进制表示:

54 45 53 54 33 20 1A 1A 1A 1A 1A 1A 1A 1A 20 46 49 4E 20 54 45 53 54 33
T  E  S  T  3  _  ?  ?  ?  ?  ?  ?  ?  ?  _  F  I  N  _  T  E  S  T  3

我认为DB2 Java客户机可能一直使用Windows代码页(在这种情况下为ISO-8859-1或cp1252)而不是UTF-8,或者服务器正在使用主整理而不是表的替代整理来转换数据。

更新3:

我安装了一个名为DbVisualizer的Java SQL工具,并在Windows上使用此工具,当在SQL面板中粘贴SQL并运行SQL并将其正确插入数据库中时。

这使我怀疑这不是安装或数据类型的问题。 可能是这三个因素之一。

  • 客户端配置
  • 客户端连接时发送的服务器属性
  • 驱动程序使用的版本类型

使用以下步骤解决了问题:

  1. 始终使用db2jcc4.jar而不是db2jcc.jar(JDBC 4)

    • (在某些地方,JDBC级别2是在OS类路径中使用db2jcc而不是DB2jcc4配置的)
  2. 设置环境变量DISABLEUNICODE = 0

在此页面中有完整的信息了解关于DB2上unicode的DB2通用数据库字符转换

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM