有人可以解释为什么字符串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
答案 0 :(得分:4)
土耳其语中的首都i
是İ
(U + 0130:拉丁大写字母I,上面有点),请参阅https://codepoints.net/U+0130
土耳其语字母,是拉丁字母的变体, 包括两个不同版本的字母I,一个点缀和 其他没用的。
无点我,我ı,表示近距离未接地的元音 (/ɯ/)。上部和小写版本都没有点。
点缀的I,İi,表示紧密的前面未接地的元音 (/一世/)。大写和小写版本都有一个点。
示例:
İstanbul/istanbuɫ/(以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;
答案 1 :(得分:0)
我无法解释它,因为我无法重现它。你的机器上肯定有问题。这是我的会话,从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>