为什么Oracle的convert函数会将带重音的“e”转换为“c”?
问题核心原因
你遇到的返回结果不符合预期的问题,本质是指定的源字符集和输入字符的编码映射不匹配,具体逻辑如下:
- 首先明确Oracle
CONVERT函数的语法规则:CONVERT(待转换字符串, 目标字符集, 源字符集),作用是将「以源字符集编码的字节序列」转换为目标字符集的编码形式。你写的语句相当于告诉Oracle:输入字符串的原始编码是EE8MSWIN1250,需要转换为US7ASCII编码。 - 你输入的
N'è'是Unicode字符(U+00E8,带抑音符的小写e),但你指定的源字符集EE8MSWIN1250(即Windows-1250中欧字符集)中,编码值0xE8对应的字符并不是'è',而是带扬抑符的小写cč(U+010D)。 - Oracle做转换时,会将输入字符的编码值直接对应为源字符集的
0xE8字节,EE8MSWIN1250的0xE8(对应č)转换为US7ASCII时的最佳映射就是普通小写字母c,因此返回了c而不是你预期的e。
验证及修复方法
如果要实现带重音的'è'转成普通'e'的需求,你需要使用西欧字符集作为源字符集,例如WE8MSWIN1252(Windows-1252西欧字符集),该字符集里0xE8对应的就是'è',转换为US7ASCII时会自动映射为e,修改后的语句如下:
select convert(N'è','US7ASCII','WE8MSWIN1252') from dual;
补充:
N前缀的字符串本身是基于数据库国家字符集存储的Unicode格式,如果你需要批量处理重音字符转ASCII的场景,更推荐使用TRANSLATE函数自定义映射规则,比硬编码字符集转换的兼容性和可控性更高。
内容的提问来源于stack exchange,提问作者Matthew McPeak
相关产品推荐
相关产品推荐

