Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Oracle Новый топик    Ответить
 NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
Добрый день!

Мне необходимо, ограничить длинну столбца varchar2, например, 40 смволами. Все было ничего, пока данные хранились в отличной от UTF-8 кодировке, где символ кириллицы занимал 1 байт, теперь же, в частности при сохранение кириллицы размер символа увеличился до 2 байт.

Если задать в качестве NLS_LENGTH_SEMANTICS тип char вместо byte, будет ли данное решение корректным?

Если не трудно, прокомментируйте, как Вы решаете проблему с ограничением количества символов?

Заранее благодарен за любые комментарии!
30 мар 09, 12:23    [6992371]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Elic
Member

Откуда:
Сообщений: 29991
some_col varchar2(40 char)
30 мар 09, 12:29    [6992414]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
Elic
some_col varchar2(40 char)

спасибо за комментарий, я это и имел ввиду, вопрос, на сколько это корректно? Вы тоже используете такой подход?
30 мар 09, 12:30    [6992421]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Elic
Member

Откуда:
Сообщений: 29991
Vargant
на сколько это корректно?
Это дословно соответствует твоим требованиям. Чего боишься? - Паранойя?
30 мар 09, 12:34    [6992462]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
Elic
Vargant
на сколько это корректно?
Это дословно соответствует твоим требованиям. Чего боишься? - Паранойя?

Паранойя

Еще один вопрос, чтобы для всех таблиц применить изменения, нужно их пересоздать или достаточно будет просто использовать alter database?

Задаю вопрос, т.к. сейчас не у рабочего компьютера и проверить нет возможнлости, а Вам как гуру думаю не составит труда прокомментировать.

п.с. Elic, выражаю Вам благодарность за комментарии и помощь!
30 мар 09, 12:49    [6992544]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Elic
Member

Откуда:
Сообщений: 29991
Vargant
Задаю вопрос, т.к. сейчас не у рабочего компьютера и проверить нет возможнлости, а Вам как гуру думаю не составит труда прокомментировать.
К чему такая спешка? Дойдёшь до компа - проверишь.
30 мар 09, 12:59    [6992620]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Vargant,

еще имейте ввиду, что - в любой кодировке - размер данных колонки таблицы/запроса
хотя бы и спецификации varchar2(4000 char) ограничен таки 4000 байт
30 мар 09, 15:00    [6993503]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
orawish
Vargant,

еще имейте ввиду, что - в любой кодировке - размер данных колонки таблицы/запроса
хотя бы и спецификации varchar2(4000 char) ограничен таки 4000 байт

Угу, спасибо за напоминание!

Elic
Vargant
Задаю вопрос, т.к. сейчас не у рабочего компьютера и проверить нет возможнлости, а Вам как гуру думаю не составит труда прокомментировать.
К чему такая спешка? Дойдёшь до компа - проверишь.

Комментирую, вдруг кому пригодится.
alter system set nls_length_semantics = char scope = both;

Данное изменение повлияет только на новые таблицы, старые придется вручную изменять.
alter table tableName modify (colName varchar2(colLength char));

Попутно вопрос, после того как я сменил с byte на char, при запросе значение осталось byte
select * from nls_database_parameters;

PARAMETER                      VALUE                                    
------------------------------ ---------------------------------------- 
NLS_LENGTH_SEMANTICS           BYTE    
NLS_RDBMS_VERSION              10.2.0.1.0    

НО!

После создания новой таблицы, подставилось char
create table t (col varchar2(20));

select column_name, char_length, char_used from user_tab_columns where table_name = 'T';

COLUMN_NAME                    CHAR_LENGTH            CHAR_USED 
------------------------------ ---------------------- --------- 
COL                            20                     C   

Это так и должно быть или .... ?
31 мар 09, 17:49    [7001235]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Деев И.
Member

Откуда: отсюда
Сообщений: 783
orawish
Vargant,

еще имейте ввиду, что - в любой кодировке - размер данных колонки таблицы/запроса
хотя бы и спецификации varchar2(4000 char) ограничен таки 4000 байт


Поэтому, на мой взгляд, лучше было бы писать так - varchar2(4000 byte).
Если текст смешанный (и латинские и русские буквы), то заранее невозможно сказать, сколько символов смешанного текста поместится, т.к. русские буквы занимают 2 байта, а латинские 1. Но при этом (4000 byte) символов поместится больше, чем если бы было жестко прописано 2000 char в расчете на максимум длины русского текста.
31 мар 09, 23:25    [7002641]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
gergo
Member

Откуда:
Сообщений: 224
Вы все подготавливаете к появлению ORA-600 [qctbyt : bfc] ?
1 апр 09, 07:32    [7003101]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
gergo
Вы все подготавливаете к появлению ORA-600 [qctbyt : bfc] ?

Почитал про ORA-600, не совсем понял, причем тут она, объясните пожалуйста.
1 апр 09, 09:17    [7003272]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
orawish
Member

Откуда: Гадюкино-2 (City)
Сообщений: 15487
Деев И.
orawish
Vargant,

еще имейте ввиду, что - в любой кодировке - размер данных колонки таблицы/запроса
хотя бы и спецификации varchar2(4000 char) ограничен таки 4000 байт


Поэтому, на мой взгляд, лучше было бы писать так - varchar2(4000 byte).
Если текст смешанный (и латинские и русские буквы), то заранее невозможно сказать, сколько символов смешанного текста поместится, т.к. русские буквы занимают 2 байта, а латинские 1. Но при этом (4000 byte) символов поместится больше, чем если бы было жестко прописано 2000 char в расчете на максимум длины русского текста.

внятного решения я не знаю..
больше символов - а зачем?
чтобы вечно объяснять пиплу, что 'васья' толще 'vasja' и ловить в конце строки призовой ()
байт-полбуквы?
1 апр 09, 11:13    [7004076]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
up NLS UTF-8, символ более 1 байта и размер столбца
1 апр 09, 17:13    [7007479]     Ответить | Цитировать Сообщить модератору
 Re: NLS UTF-8, символ более 1 байта и размер столбца  [new]
Vargant
Member

Откуда:
Сообщений: 134
up
2 апр 09, 11:37    [7010340]     Ответить | Цитировать Сообщить модератору
Все форумы / Oracle Ответить