Почему драйвер JDBC добавляет некоторые пустые символы в другое запрашиваемое поле из базы данных Oracle? - PullRequest
4 голосов
/ 16 декабря 2009

Итак, вот код, который создает таблицу в базе данных Oracle 10g / UTF-8:

CREATE TABLE TEST_SEMANTIC
(
SEMANTIC_COLBYTE char(2 byte) ,
SEMANTIC_COLCHAR char(2 char)
);

Это означает, что я использую два разных типа семантики для двух столбцов, байта и символа.

Затем я вставляю в базу данных эти соответствующие данные:

insert into test_semantic(SEMANTIC_COLBYTE,SEMANTIC_COLCHAR)
values('é','é');

Поэтому, когда я использую драйвер JDBC для запроса базы данных в java-программе и отображаю результат, я ожидаю такой вывод:

Byte>é<
Char>é<

В то время как я получаю это:

Byte>é<
Char>é      <

Когда я запрашиваю базу данных следующим образом:

select dump(semantic_colbyte,16),dump(semantic_colchar,16) from test_semantic;

Я получаю это:

Typ=96 Len=2: c3,a9 Typ=96 Len=3: c3,a9,20

Вот код Java:

public static void main(String[] args){
        Connection con = null;
        try {
            Class.forName("oracle.jdbc.driver.OracleDriver");

        } catch (java.lang.ClassNotFoundException e) {
            System.err.print("ClassNotFoundException:");
            System.err.println(e.getMessage());
        }

        try {
            Properties props = new Properties();
            props.put("user", "XXX");
            props.put("password", "XXX");

            con = DriverManager.getConnection("jdbc:oracle:thin:@xxx:1521:xxx", props);
            Statement stmt = (Statement) con.createStatement();
            stmt.execute("SELECT SEMANTIC_COLBYTE,SEMANTIC_COLCHAR FROM TEST_SEMANTIC"); 
            ResultSet result = stmt.getResultSet();
            result.next();
            String output_byte = result.getString(1);
            String output_char = result.getString(2);

        System.out.println("Byte>"+output_byte+"<");                
        System.out.println("Char>"+output_char+"<");

        } catch (SQLException ex) {
            System.err.println("SQLException: " + ex.getMessage());
        }
    }

Ответы [ 4 ]

5 голосов
/ 16 декабря 2009

CHAR Тип данных :

Тип данных CHAR определяет символьную строку фиксированной длины. Oracle гарантирует, что все значения, хранящиеся в столбце CHAR, имеют длину, указанную размером. Если вы вставите значение, которое короче длины столбца, Oracle пусто подставит значение в длину столбца.

4 голосов
/ 16 декабря 2009

Не забудьте trim свои значения при использовании char. Или не используйте char, используйте varchar2, пока вы не предоставите точное значение размера в качестве размера столбца.

Возможно, вы захотите узнать, почему, , вот оно, .

2 голосов
/ 16 декабря 2009

Вы уже читали документацию Oracle по семантике длины Oracle для типов символов?

http://download.oracle.com/docs/cd/B19306_01/server.102/b14220/datatype.htm#sthref3787

0 голосов
/ 17 декабря 2009

В каком наборе символов находится база данных (и ваш сеанс)? Мой был в AL32UTF8 и не принимал 'é' в 2-байтовом поле CHAR. В 4-байтовом поле он перешел к типу = 96 Len = 4: ef, bf, bd, 20

Символ UTF-8 может иметь длину четыре байта, и поэтому символ CHAR (2 символа) может содержать до восьми байтов. Таким образом, я мог понять строку длины 8, выходящую. Семь немного странно, почти как было сказано, первый символ - три байта, а второй - до четырех.

Можете ли вы играть с ResultSetMetaData (например, getColumnDisplaySize, getColumnTypeName) и посмотреть, что получится.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...