Как прочитать длину строки в Oracle?

#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.

скриншот livesql

Комментарии:

1. Спасибо. Сейчас я тестирую SQL-запросы на livesql.oracle.com и они работают должным образом.