#oracle
#Oracle
Вопрос:
Я создал следующую таблицу с одним текстовым столбцом:
create table table1 (
col1 varchar2(20)
);
Затем я вставил в нее одну польскую букву:
insert into table1 values ('ą')
Как я могу получить количество символов в этой строке? Это должно быть 1, но все функции, которые я знаю, возвращают другие результаты:
LENGTH(COL1)
-> 2,
LENGTHC(COL1)
-> 2,
LENGTH2(COL1)
-> 2,
LENGTH4(COL1)
-> 2,
LENGTHB(COL1)
-> 6.
Возвращает SELECT * FROM NLS_DATABASE_PARAMETERS;
:
PARAMETER VALUE
---------------------------------
NLS_RDBMS_VERSION 18.0.0.0.0
NLS_NCHAR_CONV_EXCP FALSE
NLS_LENGTH_SEMANTICS BYTE
NLS_COMP BINARY
NLS_SORT BINARY
NLS_NCHAR_CHARACTERSET AL16UTF16
NLS_CHARACTERSET AL32UTF8
NLS_ISO_CURRENCY AMERICA
NLS_TERRITORY AMERICA
NLS_LANGUAGE AMERICAN
... ...
Вы можете проверить это на: dbfiddle.uk .
Комментарии:
1.
select dump(col1) from table1
показывает, что символ хранится в шести байтах. Я не могу воспроизвести это ни на своем компьютере, ни на livesql; это вопрос к dbfiddle. Вы пробовали это на своем собственном компьютере или только на dbfiddle?2. Похоже на ошибку Oracle 18.4 (которую использует dbfiddle). У меня это работает на 12.1, 12.2, 18.7, 18.10 и 19.8
3. Я тестировал его только на dbfiddle. Спасибо — это решает проблему.
4. @a_horse_with_no_name — мне кажется более вероятным, что это ошибка dbfiddle (возможно, в том, как он считывает символы из своего веб-интерфейса или еще что-то), а не ошибка Oracle, независимо от версии.
Ответ №1:
Скорее всего, это ошибка с версией Oracle, на которой выполняется запрос, или проблема с символом, кодируемым на веб-сервере.
В моей системе почти все одинаковые параметры NLS, за исключением того, что я использую Oracle 19 вместо 18.
Даже на livesql.oracle.com он возвращает результаты, как и следовало ожидать, но опять же, эта база данных находится на Oracle 19.
Комментарии:
1. Спасибо. Сейчас я тестирую SQL-запросы на livesql.oracle.com и они работают должным образом.