2015-03-06 5 views
0

У меня есть таблица, имеющий столбец, определенный varchar2 (255 байт), Когда я вставить запись с помощью класса Спринг JDBC У меня есть сообщение об ошибкеOracle VARCHAR2 (байт) против Java байт

; nested exception is java.sql.BatchUpdateException: ORA-12899: de­er "DBB"."USERS"."NICK" s³tunu iin ok b³y³k (as²l: 441, maksimum: 255) 

Я Обрезка Строка с помощью следующих метод, но он не работает

public static String filterStringForTxnLog(String string) {  
     try { 
     String noPipe = string.replace('|', '.'); 
     byte noPipeBytes[]= noPipe.getBytes("UTF-8"); 
     if (noPipeBytes.length > 255) { 
      byte [] cropBytes = new byte[255]; 
      for(int i=0;i<255;i++){ 
       cropBytes[i]=noPipeBytes[i]; 
      } 
      return new String(cropBytes); 
     } 
     return noPipe; 
     } catch (Exception e) { 
     logger.error("Nick filter error string:" + string, e); 
     return ""; 
     } 
    } 

Когда я пройти следующий размер строки новой строки не соответствует столбец БД.

||123123123123123123123123kşlkşlkşlk12şl3l1k3şl21kşl3üğüğoşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşşş123123123123123123123123123123123123123123112321323123123123 
+3

В чем проблема бизнеса, которую вы пытаетесь решить? Было бы нецелесообразно пытаться усечь кодированную строку UTF-8 на произвольное количество байтов. Если вы случайно обрезали середину символа, это оставит вас с недопустимой строкой. Возможно, вы хотите усечь строку на число кодов Unicode, которые могут быть закодированы в 255 байт (что все еще проблематично, если у вас есть такие вещи, как объединение символов). Но гораздо вероятнее, что вы хотите сделать что-то вроде объявить столбец 'varchar2 (255 char)' и усечь строку на 255 символов. –

+0

Да, это точное решение, но у меня нет никаких прав на это изменение, поэтому я пытаюсь решить эту проблему на уровне Java, а не на БД. –

ответ

1

Это проблема с кодировкой. У вас есть некоторые символы UTF-8, которые кодируются в несколько байтов, что делает его более 255 байт. Взлом его до 255 байт опасен и может привести к коррупции. Вам необходимо учитывать кодировку.

1

Вместо этого вам нужно изменить определение столбца на VARCHAR2 (255 CHAR).

+0

Да, это точное решение, но у меня нет никаких привилегий, чтобы сделать это изменение, поэтому я пытаюсь решить эту проблему на уровне Java, а не на БД. –

0

Я изменил создание строки следующим образом, затем он работает правильно.

return new String(cropBytes,"UTF-8"); 
+0

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

+0

вы можете привести пример? –

+2

Нет, но я дам вам пример с 5 символами =) Это приведет к окончательному символу, прерванному в UTF-8: 1234 € Символ евро занимает три байта для кодирования, так что 5-символьная строка действительно равна 7 байтам. если вы отрубите его на 5 символов, вы получите 1234 и недопустимый символ. – Necreaux

Смежные вопросы