当前位置: 首页 > 知识库问答 >
问题:

DB2使用ALT_COLLATE unicode在非unicode数据库中插入UTF-8字符

吕昀
2023-03-14
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','其他');
    null
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

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

    null
    null

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

更新:

我还尝试用SQL加载一个UTF-8文件。文件正确加载,使用UTF-8字符调试SQL也正确传递给语句,但结果是相同的。

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();
}
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,或者服务器使用表的主排序规则而不是替代排序规则来转换数据。

    null

共有1个答案

谭正谊
2023-03-14

问题可以通过以下步骤解决:

>

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

    • (在某些地方,JDBC level 2在OS类路径中配置为db2jcc而不是DB2jcc4)

  •  类似资料:
    • 我需要添加用户名从Facebook到数据库,这些名称有UTF-8字符,如 (ą,č,ę,ė,į,š,ų,ū).当我把它添加到数据库中,例如字母看起来像

    • 问题内容: 我正在使用 Ubuntu 9.04 我已经安装了以下软件包版本: 我已经这样配置: 我已经这样配置: 我已经从Pyodbc修订版中获取并使用“ ”进行了安装 我有一台装有 Microsoft SQL Server 2000 的Windows机器,安装在本地网络上,并在本地IP地址10.32.42.69上侦听。我有一个名为“ Common”的空数据库。我的用户“ sa”具有完全特权的密码

    • 问题内容: 我首先尝试使用python将字符串存储在sqlite中,并得到以下消息: sqlite3.ProgrammingError:除非使用可以解释8位字节串的text_factory(如text_factory = str),否则不得使用8位字节串。强烈建议您改为将应用程序切换为Unicode字符串。 好的,我切换到Unicode字符串。然后我开始收到消息: sqlite3.Operatio

    • 本文向大家介绍Python MySQLdb 使用utf-8 编码插入中文数据问题,包括了Python MySQLdb 使用utf-8 编码插入中文数据问题的使用技巧和注意事项,需要的朋友参考一下 最近帮伙计做了一个从网页抓取股票信息并把相应信息存入MySQL中的程序。 使用环境: Python 2.5 for Windows MySQLdb 1.2.2 for Python 2.5 MySQL 4

    • 问题内容: 我必须用Java处理这种情况: 我从声明了encoding = utf-8的客户端收到XML格式的请求。不幸的是,它可能不包含utf-8字符,并且有必要从我这一边的xml中删除这些字符(旧式)。 让我们考虑一个示例,其中该无效XML包含£(磅)。 1)我将xml作为带有£的java字符串(我现在无法访问接口,但我很可能将xml作为java的字符串)。我可以使用replaceAll(£,

    • 我需要在html页面上插入一个欧米茄(欧米茄)。我使用它的HTML转义代码来实现这一点,因此我可以编写并获得?。当我将它放入HTML元素中时,这一切都很好;但是,当我尝试将其放入我的JS中时,例如时,它将代码解析为JS,整个过程无法运行。有人知道怎么做吗?