Почему строчные буквы "я" сопоставлены с "?" после выполнения 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>