Sql 如何将全宽字符转换为半宽字符

Sql 如何将全宽字符转换为半宽字符,sql,oracle,Sql,Oracle,在我的Oracle数据库中,我有下表 FULL_WIDTH_NUM 135-0061 KDDI(株) 170-0012 170-0012 170-0012 135-0052 135-0061 170-0012 261-0023 我正在用TOAD运行我的查询。该字段的字符集为AL16UTF16。我想将此字段转换为半角字符。 当我尝试在字段中使用单字节时,我得到了ORA-29275:部分多字节字符。为什么我会得到这个ORA-29275:部分多字节字符?是否有其他方法可以将此字段转换为半角字符

在我的Oracle数据库中,我有下表

 FULL_WIDTH_NUM
135-0061
 KDDI(株)
170-0012
170-0012
170-0012
135-0052
135-0061
170-0012
261-0023
我正在用TOAD运行我的查询。该字段的字符集为AL16UTF16。我想将此字段转换为半角字符。 当我尝试在字段中使用单字节时,我得到了ORA-29275:部分多字节字符。为什么我会得到这个ORA-29275:部分多字节字符?是否有其他方法可以将此字段转换为半角字符


谢谢

全宽字符不仅仅是在普通字符的两边加上空白字节,它们是完全不同的字符,所以你必须翻译它们

幸运的是,您只需将全半角字符转换为其整数值,然后减去15711328即可得到等效的ASCII码。您可以通过执行select ascii'在系统上再次检查此号码1'-49名来自双重国籍;49=ASCII“1”。我不记得为什么Oracle Unicode十进制值与您预期的不同-通常您要减去65248,因为fullwidth块从U+FF01开始

无论如何,假设您的表名为my_table:

最里面的查询将每个字段拆分为1个字符的段。如果字符位于Unicode全宽块中,则带有fw_char2的下一个out将减去15711328。最外层的查询只是将它们转换回字符并粘贴在一起


如果您除了rowid之外还有其他唯一的密钥,那可能会更干净。

抱歉,我想说的是我正在使用Oracle SQL。
select listagg(chr(fw_char2)) within group(order by lvl) 
from
  (select rid, lvl, 
      CASE WHEN ascii(fw_char) between 15711328 and 15712174 
           THEN ascii(fw_char)-15711328
           ELSE ascii(fw_char) 
      END as fw_char2
   from 
      (select my_table.rowid as rid, 
              substr(full_width_num, lvl, 1) as fw_char, 
              lvl
        from my_table
        join (select level as lvl from dual connect by level <= 4000) 
            on lvl <= length(full_width_num)
      ) splitfield
   )
group by rid
;