【问题标题】:Select returns "¿" character选择返回“¿”字符
【发布时间】:2019-05-09 16:55:18
【问题描述】:

我的查询:

SELECT op_arv
FROM my_table@OTHER_DB

返回:

d¿identification

“¿”符号不应该在那里。

如果我然后运行:

SELECT 
 substr(op_arv,2,1) AS t_substr
,ascii(substr(op_arv,2,1)) AS t_ascii
,chr(ascii(substr(op_arv,2,1))) AS t_chr_ascii
,asciistr(substr(op_arv,2,1)) AS asciistr_1
FROM my_table@OTHER_DB

我得到以下输出:

¿
146
¿
\0092

ASCII 函数返回 146,它对应于有意义的 '(撇号)符号。但如果我尝试“CHR()”实际值,我将得到 ¿ 而不是 '。 CHR(146) 给了我正确的符号...

运行 ASCIISTR 函数将返回 Unicode 值 \0092,它是一个 unicode 控制字符,而不是撇号...

我正在使用 NLS_CHARACTERSET= WE8MSWIN1252 运行 Oracle 11gR2。我正在(通过数据库链接)连接到使用 NLS_CHARACTERSET= WE8ISO8859P1 运行的 Oracle 数据库。

有什么想法吗?

谢谢!

【问题讨论】:

  • asciistr 结果为十六进制; base-16 中的 92 是 base-10 中的 146,所以匹配。您的 client 字符集是什么 - 例如如果您使用的是 SQL*Plus(我猜是 US7ASCII),则来自您的 NLS_LANG 设置;和你的操作系统/外壳/仿真器编码?这看起来像是客户端渲染问题,而不是数据或数据库问题。
  • 您使用哪个工具来运行 select 语句?

标签: database oracle character-set


【解决方案1】:

很可能您没有设置NLS_LANG 值,Oracle 将其默认为AMERICAN_AMERICA.US7ASCII

SQLplus从命令行继承字符集,你可以用命令chcp查询/更改代码页,然后你必须相应地设置NLS_LANG

例子:

chcp 1252
set NLS_LANG=.WE8MSWIN1252
sqlplus ...

如果您在 Linux 上工作,请使用 locale charmapecho $LANG 检索终端的编码。

NLS_LANG不需要设置等于你的数据库字符集,但是你选择的字符集必须支持你的字符

【讨论】:

    猜你喜欢
    • 2013-08-19
    • 2015-07-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多