如何将全角字符转换为半角字符

时间:2018-01-09 18:53:06

标签: 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。我想将此字段转换为半角字符。 当我尝试在字段上使用to_single_byte时,我得到ORA-29275:部分多字节字符。为什么我得到这个ORA-29275:部分多字节字符?我还有另一种方法可以将这个字段转换为半角字符吗?

由于

1 个答案:

答案 0 :(得分:1)

全宽字符不仅仅是将空格字节添加到常规字符的任意一侧 - 它们是完全不同的字符,因此您必须翻译它们。

幸运的是,您只需将全角字符转换为整数值,然后减去15711328即可获得等效的ASCII。您可以通过执行A(49 = ASCII“1”)在系统上仔细检查此编号。 (我不记得为什么Oracle Unicode十进制值与你期望的不同 - 通常你会减去65248,因为全宽块从U + FF01开始。)

无论如何,假设您的表名为select ascii('1')-49 from dual;

my_table

最里面的查询将每个字段拆分为1-char段。如果字符在Unicode全宽块中,则下一个输出(使用fw_char2)会减去15711328。最外面的查询只是将它们转换回字符并将它们粘贴在一起。

如果除了rowid之外你还有其他一些独特的键,那可能会更干净。