2016-08-02 2 views
0

При попытке сохранить в таблице Oracle SQL строку из более чем 100 символов, в то время как ограничение поля - 1000 байт, которое я понял, составляет ~ 1000 английских символов, я выхожу допустимые границы, за исключением:VARCHAR2 (1000) ограничено только 100 символами

StringIndexOutOfBoundsException: String index out of range: -3

Что может быть причиной такого низкого ограничения?

Спасибо!

EDIT:

код, где происходит ошибка (см chat):

// Commenting the existing code, because for sensitive information 
// toString returns masked data 
int nullSize = 5; 
int i = 0; 

// removing '[' and ']', signs and fields with 'null' value and also add 
// ';' as delimiter. 
while (i != -1) { 
    int index1 = str.indexOf('[', i); 
    int index2 = str.indexOf(']', i + 1); 
    i = index2; 
    if (index2 != -1 && index1 != -1) { 
     int index3 = str.indexOf('=', index1); 
     if (index3 + nullSize > str.length() || !str.substring(index3 + 1, index3 + nullSize).equals("null")) { 
      String str1 = str.substring(index1 + 1, index2); 
      concatStrings = concatStrings.append(str1); 
      concatStrings = concatStrings.append(";"); 
     } 
    } 
} 
+2

Поделитесь тем, что вы используете, чтобы вставить эту строку в таблицу Oracle, поскольку эта ошибка связана с индексированием в строку, а не с усечением данных из-за того, что она вставлена ​​в столбец с типом данных, который слишком мал для представления ваших данных. Не только это, но и ограничения полей в 1000 байт не обязательно означают 1000 символов, поскольку это зависит от кодировки символов. –

+0

@JonathonOgden: на данный момент не было доступа к вставленному запросу, но если кодировка UTF-8, будет ли это ограничение, равное только 100 английским символам под 1000Bytes? – Batman

+0

Как вы получаете это исключение? Что вы делаете именно так? –

ответ

2

Как правило, когда строка для хранения в поле varchar слишком длинная, она обрезается молча. Во всяком случае, когда есть сообщение об ошибке, оно обычно специфично. Ошибка, похоже, связана с операцией над строкой (String.substring()?).

Кроме того, даже если строка кодируется в UTF-8, отношение символов/байтов не должно быть таким низким.

Вы действительно должны поместить образец кода, где ваша ошибка возникает в вашем вопросе, и строка, вызывающая это, а также более подробно посмотреть на стеке, чтобы увидеть, где происходит ошибка.

Из кода вы публикуемую в вашем chat, я могу видеть эту строку кода:

String str1 = str.substring(index1 + 1, index2); 

Вы проверить, что INDEX1 и index2 отличаются от -1, но вы не проверить, если (index1 + 1) >= index2, что делает ваш сбой кода.

Попробуйте это с помощью str = "*]ab=null[" (длина которого составляет менее 100 символов), но вы также можете получить ошибку с более длинной строкой, такой как "osh]] [ = null ]Clipers: RRR was removed by user and customer called in to have it since it was an RRT".

Еще раз размер строки не имеет значения, только содержание !!!

Вы можете воспроизвести вашу проблему является закрывающей квадратной скобкой (]) перед открытием одного ([) и между ними знаком равенства (=), а затем (непосредственно или нет) с помощью "null" строки.

+0

Хорошо, получилось, но у него не получается для строк ниже 100 символов?! :( – Batman

+0

@Batman Вы уверены, что это не просто совпадение? Еще раз, пожалуйста, укажите значение 'str' –

+0

значение:« Josh]]] Клипы: RRR был удален пользователем и клиентом, вызванным, чтобы иметь так как это был RRT "это строковое значение человека, введенного через GUI, и только тогда, когда> 100 символов он терпит неудачу .... иначе это не будет исключение OOB :( – Batman

0

Я согласен с Джонатаном Огден «ограничениями 1000 байт не обязательно означает 1000 символов, поскольку это зависит по кодировке символов ".

Я рекомендую вам колонку «Изменить» в таблице Oracle от VARCHAR2 (1000 байт) до VARCHAR2 (1000 Char).

+0

Но в UTF-8, каково будет ограничение при разговоре около 1000 байт? – Batman

+0

Если в столбце есть ограничение на 1000 байтов, и вы используете кодировку UTF-8, то 100 английских символов не должны быть проблемой вообще. Я считаю, что UTF-8 кодируется в пределах от 1 до 4 байтов на символ, так что вы в пределах 1000 байтов с 100 английскими символами. –

+0

Но когда вы используете ']' или '[', это будет значительный рост? или позволяет сказать, когда кто-то пишет на кириллических письмах, как это было на английском? – Batman

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