Почему строчные буквы "я" сопоставлены с "?" после выполнения NLS_UPPER

Может кто-нибудь объяснить, почему строчные i в строке abcdefghijklmnopqrstuvwxyz сопоставлен с ? тогда как все остальные алфавиты правильно сопоставлены с соответствующими прописными буквами.

SQL> ALTER SESSION SET NLS_SORT="xturkish";

Session altered.

SQL> 
SQL> begin
  2   DBMS_OUTPUT.PUT_LINE('NLS_UPPER(abcdefghijklmnopqrstuvwxyz) = '
  3                || NLS_UPPER('abcdefghijklmnopqrstuvwxyz'));
  4  end;
  5  /
NLS_UPPER(abcdefghijklmnopqrstuvwxyz) = ABCDEFGH?JKLMNOPQRSTUVWXYZ

PL/SQL procedure successfully completed.

SQL> 

Обновление: если для nls_sort установлено значение BINARY, сопоставление происходит, как и ожидалось, в нижнем регистре i карты на плоскости английского алфавита I

2 ответа

Столица i по турецки это İ (U+0130: латинская заглавная буква I с точкой выше), см. https://codepoints.net/U+0130

Турецкий алфавит, который является вариантом латинского алфавита, включает в себя две различные версии буквы I, одна пунктирная, а другая без точек.

Точка I, I ı, обозначает закрытый необоснованный гласный звук (/ɯ/). Ни в верхнем, ни в нижнем регистре версия не имеет точки.

Пунктирная I, i, i обозначает закрытый фронтальный необоснованный гласный звук (/i/). Обе версии в верхнем и нижнем регистре имеют точку.

Примеры:

  • Стамбул /isˈtanbuɫ/ (начинается со звука i, а не ı).

  • Diyarbakır / dijaɾˈbakɯɾ / (первая и последняя гласные пишутся по-разному)

Похоже, ваш набор символов в базе данных не поддерживает этот символ. Какой набор символов в вашей базе данных? Проверить с

SELECT * 
FROM V$NLS_PARAMETERS 
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');

Я предполагаю

DBMS_OUTPUT.PUT_LINE('NLS_UPPER(abcdefghijklmnopqrstuvwxyz) = '
   || NLS_UPPER(N'abcdefghijklmnopqrstuvwxyz')); 

должно сработать.

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

C:\>set NLS_LANG=.AL32UTF8
C:\>chcp 65001
Active code page: 65001

C:\>sqlplus ...
select nls_upper('i', 'nls_sort = xturkish') from dual;



C:\>set NLS_LANG=.TR8MSWIN1254
C:\>chcp 1254
Active code page: 1254

C:\>sqlplus ...
select nls_upper('i', 'nls_sort = xturkish') from dual;




C:\>set NLS_LANG=.SE8ISO8859P3
C:\>chcp 28593
Active code page: 28593

C:\>sqlplus ...
select nls_upper('i', 'nls_sort = xturkish') from dual;




C:\>set NLS_LANG=.WE8ISO8859P9
C:\>chcp 28599
Active code page: 28599

C:\>sqlplus ...
select nls_upper('i', 'nls_sort = xturkish') from dual;

Я не могу объяснить это, потому что я не могу воспроизвести это. Что-то должно быть не так на вашей машине. Вот мой сеанс, скопированный и вставленный из SQL*Plus:

SQL> set serveroutput on
SQL> ALTER SESSION SET NLS_SORT="xturkish";

Session altered.

Elapsed: 00:00:00.01
SQL> begin
  2     DBMS_OUTPUT.PUT_LINE('NLS_UPPER(abcdefghijklmnopqrstuvwxyz) = '
  3                  || NLS_UPPER('abcdefghijklmnopqrstuvwxyz'));
  4    end;
  5  /
NLS_UPPER(abcdefghijklmnopqrstuvwxyz) = ABCDEFGHIJKLMNOPQRSTUVWXYZ

PL/SQL procedure successfully completed.

Elapsed: 00:00:00.00
SQL>
Другие вопросы по тегам