Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
PtNt
Member

Откуда:
Сообщений: 9
Наблюдал на системе клиента сбой влива данных при внешней интеграции, решили быстро костылем, поэтому не помню всех подробностей, но случай заинтересовал.

Итак, БД Oracle, версия вроде бы 11g. Не исполнялся SQL-запрос вида:

update  MY_TABLE set DSC = '<ЗдесьТекстИз3000+Символов' where ID = XXX


Поле MY_TABLE.DSC описано как: varchar2(4000 CHAR)

Сам текст точно меньше 4 тысяч символов (проверяли в Notepad++), спец. символов типа перевода строк мало.
Но Oracle выдавал ошибку при апдейте - к сожалению, не помню какую.
Если сделать так:

update  MY_TABLE set DSC = :VALUE where ID = XXX

и прибиндить параметр такую же строку - тоже ошибка, но с другим кодом.
На локальной базе своей попробовал - у меня все корректно работало.

Текст в результате чуть обрезали и вставили ручками.

Но меня все одолевает вопрос - что это могло быть? Какие то специфические настройки Oracle сервера? Не могу докопаться до истины.
9 янв 19, 00:22    [21780158]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
miksoft
Member

Откуда:
Сообщений: 38544
PtNt,

https://docs.oracle.com/cd/B28359_01/server.111/b28320/limits001.htm#i287903
VARCHAR2 Maximum size: 4000 bytes
9 янв 19, 00:28    [21780160]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
PtNt
Oracle выдавал ошибку при апдейте - к сожалению, не помню какую.
Если сделать так ... ... - тоже ошибка, но с другим кодом.
Но меня все одолевает вопрос - что это могло быть? Какие то специфические настройки Oracle сервера? Не могу докопаться до истины.


«Дорогие учёные. У меня который год в подполе происходит подземный стук. Объясните, пожалуйста, как он происходит»

З.Ы.
Без точного текста ошибок установить, что пошло не так - будет крайне затруднительно. Можно придумать тысячу и одну версий, но все они будут на уровне догадок ...
9 янв 19, 07:20    [21780217]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Elic
Member

Откуда:
Сообщений: 29979
Щукина Анна
Без точного текста ошибок установить, что пошло не так - будет крайне затруднительно. Можно придумать тысячу и одну версий, но все они будут на уровне догадок ...
Странно такое слышать. Наверно поговорить просто хочется?
Причина очевидна. И miksoft на неё указал. А ТС уже даже не в начале 21-ого века по-прежнему считает, что кругом может быть только однобайт.
9 янв 19, 07:32    [21780219]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Elic,

Смущает, что две разных ошибки...
9 янв 19, 08:01    [21780227]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Elic
Member

Откуда:
Сообщений: 29979
Щукина Анна
Смущает, что две разных ошибки...
По-твоему, клиент, не имея технической возможности донести перезначение до сервера, должен падать с серверной ошибкой?
9 янв 19, 08:07    [21780230]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Elic,

это по твоему.

По-моему - ТС ничего не говорил о путях доставки запроса в базу.
Уж, как минимум, из его описания не следует явно, что оба апдейта пришли в базу разным путем...
9 янв 19, 08:15    [21780233]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Elic
Member

Откуда:
Сообщений: 29979
Щукина Анна
По-моему - ТС ничего не говорил о путях доставки запроса в базу.
Да ну?
PtNt
и прибиндить параметр такую же строку - тоже ошибка, но с другим кодом.
9 янв 19, 08:17    [21780234]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
-2-
Member

Откуда:
Сообщений: 15330
Щукина Анна
Смущает, что две разных ошибки...
Не две. На ограничение длины ошибок больше. В данном случае одно ограничение на литерал и другое на устанавливаемое значение.
9 янв 19, 08:19    [21780236]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
Elic,


и?
9 янв 19, 08:20    [21780237]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Щукина Анна
Member

Откуда:
Сообщений: 1489
-2-,

но никаких других ошибок, кроме неверной длины литерала, или неверной длина вставляемого в поле таблицы значения, конечно же, произойти не могло?

тогда ок - убедили...
9 янв 19, 08:23    [21780239]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
-2-
Member

Откуда:
Сообщений: 15330
Щукина Анна
но никаких других ошибок, кроме неверной длины литерала, или неверной длина вставляемого в поле таблицы значения, конечно же, произойти не могло?
Про литерал очевидно. Про другие ошибки, зависит от... Биндинг может выдать ошибку размера буфера. Апдейт может вызвать триггер, констрейнт, вычисляемое поле и т.п. с другими ошибками.
9 янв 19, 08:48    [21780254]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Александр Бердышев
Member

Откуда: Санкт-Петербург
Сообщений: 349
Насчёт оракла точно не скажу, но в одно БД встречал ситуацию, когда в зависимости от кодировки, один символ занимал места как два.
Проверьте: начиная со скольки символов перестаёт нормально работать.
9 янв 19, 15:12    [21780655]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
andrey_anonymous
Member

Откуда: Москва
Сообщений: 18351
Александр Бердышев
встречал ситуацию, когда в зависимости от кодировки, один символ занимал места как два.

Маловато будет :)
К примеру, в UTF8 символ может занимать от 1 до 6 байт.
Чтите unicode.org до просветления.
9 янв 19, 15:28    [21780675]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
Elic
Member

Откуда:
Сообщений: 29979
Александр Бердышев
когда в зависимости от кодировки, один символ занимал места как два.
Технически грамотный специалист сказал бы два байта.
Александр Бердышев
начиная со скольки символов перестаёт нормально работать.
Когда lengthb становится больше 4000.
9 янв 19, 15:29    [21780677]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
PtNt
Member

Откуда:
Сообщений: 9
miksoft
PtNt,

https://docs.oracle.com/cd/B28359_01/server.111/b28320/limits001.htm#i287903
VARCHAR2 Maximum size: 4000 bytes

вот это да... Забыл совсем, а ведь когда то знал ))

Непонятно только тогда зачем Oracle разрешает в таблицах создавать поля varchar2 (4000 CHAR), он же четко понимает, что больше 2000 символов точно никак не влезет при любой кодировке... :(
9 янв 19, 17:35    [21780885]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
PtNt
Member

Откуда:
Сообщений: 9
PtNt
Непонятно только тогда зачем Oracle разрешает в таблицах создавать поля varchar2 (4000 CHAR), он же четко понимает, что больше 2000 символов точно никак не влезет при любой кодировке... :(

в смысле, не влезет 4000 символов при текущей кодировке 2 байта на символ.
9 янв 19, 17:40    [21780896]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
он же четко понимает, что больше 2000 символов точно никак не влезет при любой кодировке...


Откройте для себя однобайтовые кодировки.
9 янв 19, 17:40    [21780897]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
dmdmdm
Member

Откуда: Нижний Новгород
Сообщений: 1639
PtNt
кодировке 2 байта на символ.


Когда-то люди старались, придумывали кодировки с переменным числом байтов на символ.

Ибо сказано было "640К хватит всем".
9 янв 19, 17:47    [21780911]     Ответить | Цитировать Сообщить модератору
 Re: Не дает сохранить < 4к символов в поле varchar2(4000 CHAR)  [new]
-2-
Member

Откуда:
Сообщений: 15330
PtNt
зачем Oracle разрешает в таблицах создавать поля varchar2 (4000 CHAR), он же четко понимает, что больше 2000 символов точно никак не влезет при любой кодировке
1. al32utf8 влезет от 1000 до 4000 символов, причем 4 байта могут занимать и русские буквы кириллицы. Например, Й может быть представлена как 2 байта и как 4 байта
2. Данные либо не ограничиваются, полагаясь на заведомо "большой" размер 4000 байт, либо ограничиваются более скромными значениями. Для неограниченных типов придпочитаю писать byte.
9 янв 19, 19:10    [21780980]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить