【问题标题】:Oracle database special characters saving as asciiOracle 数据库特殊字符另存为 ascii
【发布时间】:2016-11-07 12:33:41
【问题描述】:

当我尝试将 Özyeğin University 保存到 oracle 数据库时,它会保存为 Özyeğin University => ğ = ğ

这发生在我的客户端数据库中而不是我的数据库中,经过检查并且两者都使用相同的字符集 => NLS_CHARACTERSET = AL32UTF8

任何想法

【问题讨论】:

  • 我不确定我是否理解您的问题 - they look the same to me.
  • 它们都是U+011F:“带短的拉丁小写字母 G”。你有什么问题?
  • 您使用哪个工具插入和查询数据?

标签: sql oracle special-characters


【解决方案1】:

不确定它在您的屏幕上的外观;在我的(使用默认的美国设置)上,角色完全相同。话虽如此:问题通常不是数据库字符集(在服务器上),而是前端字符集(客户端)——无论是在输入时还是在检索时(或两者兼而有之)。要查看存储在数据库中的确切字符,请像这样使用 DUMP:

select 'Özyeğin' as str, dump('Özyeğin') as codes from dual;

这将确切地告诉您数据库中存储了什么,因此您至少可以缩小问题的范围 - 是与存储的内容有关,还是仅与从数据库中选择时显示的内容有关? (实际上,不要像我展示的那样完全使用DUMP();而是select dump(col_name) from table_name where id = ...,其中id 是包含大学名称的行的某个id 值;您想查看数据库中的IN A TABLE 中的内容,不像我的示例中那样即时编造。col_name 是包含大学名称的列的名称。)

为了说明问题,这里有一个 SQL*Plus 的简短会话。请注意如何使用我的标准字符集 (请参阅下面的 cmets - 我的默认值是 cp 1252,因为我做到了)(代码页 1252,西欧字符集的 Microsoft 名称) ğ 变成 g (即使在数据库中 - 它甚至在发送到数据库之前由前端进行翻译),但是如果我将字符集更改为 1254(土耳其语),则字母会被保留,并且 DUMP 会显示 ğ in 的正确代码代码页 1254。

SQL> select 'Özyeğin' as str, dump('Özyeğin') as codes from dual;

STR     CODES
------- -----------------------------------------
Özyegin Typ=96 Len=7: 214,122,121,101,103,105,110


SQL> host chcp 1254
Active code page: 1254

SQL> select 'Özyeğin' as str, dump('Özyeğin') as codes from dual;

STR     CODES
------- -----------------------------------------
Özyeğin Typ=96 Len=7: 214,122,121,101,240,105,110

所以:如果我使用西欧字符集向数据库输入数据,那么 ğ 被更改为 g(DATABASE 字符集是什么无关紧要,因为它从来没有收到 ğ,它收到了 g) .但是,如果一切正常,如果用于查看数据库结果的前端不使用土耳其语字符集,您可能仍会在输出中看到 g。 (但是,在后一种情况下,您可能不会得到“g” - 您将得到客户端字符集中的任何代码 240;在 cp 1252 中,它是 ð,而不是 g...)

【讨论】:

  • 当您启动 SQL*Plus 时,它会从命令行 cmd.exe 继承代码页。这(默认情况下)不是 CP1252,但很可能是 CP437(美国)或 CP850(大多数欧洲国家)。您可以使用chcp 命令获取当前代码页。
  • @WernfriedDomscheit - 你可能不记得了,但你教会了我这一点。在我的机器上,“默认”是 1252,因为我在 login.sql 中添加了host chcp 1252。我在 OTN 上写了这些注释,解释了如何更改批处理文件中的代码页...比host chcp .... 更复杂
  • 你是对的,但我认为值得一提的是,默认情况下 SQL*Plus 的代码页不是 CP1252(尽管很多人认为)——除非你聪明地设置它不同.
  • @WernfriedDomscheit - 好点,我会在答案中提到这一点。谢谢!
  • 我认为这是一个前端问题,当我提交表单时获取(无法解码值)
猜你喜欢
  • 1970-01-01
  • 2021-06-14
  • 2021-06-21
  • 1970-01-01
  • 2021-07-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-13
相关资源
最近更新 更多