代码之家  ›  专栏  ›  技术社区  ›  Matthew McPeak

为什么Oracle转换函数会将重音符号“e”转换为“c”?

  •  0
  • Matthew McPeak  · 技术社区  · 3 年前

    在Oracle 12.1中,以下查询。。。

    select convert(N'è','US7ASCII','EE8MSWIN1250') from dual;
    

    返回“c”。我希望得到一个“e”。

    为什么会这样?我不太擅长人物设定问题。

    1 回复  |  直到 3 年前
        1
  •  1
  •   kfinity    3 年前

    N'è' 在UTF-16中为0x00E8,因此这些字节是CONVERT函数的原始输入。源字符集是EE8MSWIN1250,因此Oracle假设您希望在该代码页中使用0xE8。

    在里面 the EE8MSWIN1250 codepage ,0xE8映射到;如果将其转换为ASCII,则最接近的匹配项为“c”。

    与您的其他示例类似-=0xEF,它位于EE8MSWIN1250中。

    老实说,我很惊讶这些返回了任何东西——我用CONVERT尝试的很多字符集转换根本不起作用。

        2
  •  1
  •   Littlefoot    3 年前

    我不知道为什么。但是 documentation

    对于字符转换中的完全对应, 目标字符集必须包含源字符集中定义的所有字符的表示。 如果目标字符集中不存在字符,则会出现替换字符

    SQL> select convert(N'è','US7ASCII','EE8MSWIN1250') from dual;
                        ----  --------   ------------
    C                   char  destination    source charset
    -
    c
    

    显然,US7ASICI并不包含EE8MSWIN1250字符集中的所有字符;是吗?“¨”的替换字符(当涉及这两个字符集时)似乎是 c ,所以这就是你所得到的。