为什么小写'我'映射到'?'做完NLS_UPPER后

时间:2017-07-20 11:25:26

标签: sql oracle nls nls-sort

有人可以解释为什么字符串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 个答案:

答案 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>