Oracle JDBC charset et 4000 char limite

Nous essayons de stocker une codé en UTF-16 de Chaîne dans une AL32UTF8 de base de données Oracle.

Notre programme fonctionne parfaitement sur une base de données qui utilise WE8MSWIN1252 comme jeu de caractères. Quand nous essayons de le faire fonctionner sur une base de données qui utilise AL32UTF8 il arrive à un java.sql.SQLException: ORA-01461: can bind a LONG value only for insert into a LONG column.

Dans le cas de test ci-dessous tout fonctionne bien aussi longtemps que nos données d'entrée ne soit pas trop long.

La Chaîne d'entrée peut dépasser les 4000 caractères. Nous souhaitons conserver autant d'informations que possible, même si nous nous rendons compte de l'entrée devra être coupée.

Nos tables de base de données sont définies à l'aide de la CHAR mot-clé (voir ci-dessous). Nous espérons que cela nous permettrait de stocker jusqu'à 4000 caractères de caractère. Cela peut-il être fait? Si oui, comment?

Nous avons essayé de convertir la Chaîne de UTF8 à l'aide d'un ByteBuffer sans succès. OraclePreparedStatement.setFormOfUse(...) ne voulait pas nous aider.

De passer à un CLOB n'est pas une option. Si la chaîne est trop longue, il doit être coupé.

C'est notre code pour le moment:

public static void main(String[] args) throws Exception {
    String ip ="193.53.40.229";
    int port = 1521;
    String sid = "ora11";
    String username = "obasi";
    String password = "********";

    String driver = "oracle.jdbc.driver.OracleDriver";
    String url = "jdbc:oracle:thin:@" + ip + ":" + port + ":" + sid;
    Class.forName(driver);

    String shortData = "";
    String longData = "";
    String data;

    for (int i = 0; i < 5; i++)
        shortData += "é";

    for (int i = 0; i < 4000; i++)
        longData += "é";

    Connection conn = DriverManager.getConnection(url, username, password);

    PreparedStatement stat = null;
    try  {
        stat = conn.prepareStatement("insert into test_table_short values (?)");
        data = shortData.substring(0, Math.min(5, shortData.length()));
        stat.setString(1, data);
        stat.execute();

        stat = conn.prepareStatement("insert into test_table_long values (?)");
        data = longData.substring(0, Math.min(4000, longData.length()));
        stat.setString(1, data);
        stat.execute();
    } finally {
        try {
            stat.close();
        } catch (Exception ex){}
    }
}

C'est le script de création de la table simple:

CREATE TABLE test_table_short (
    DATA    VARCHAR2(5 CHAR);
);

CREATE TABLE test_table_long (
    DATA    VARCHAR2(4000 CHAR);
);

Le cas de test fonctionne parfaitement sur le court de données. Sur le long données, cependant, il continue à recevoir l'erreur. Même quand nos longData est seulement 3000 caractères, il ne s'est toujours pas exécuté avec succès.

Merci d'avance!

OriginalL'auteur Arolition | 2012-07-19