Oracle数据库特殊字符另存为ascii

时间:2016-11-07 12:33:41

标签: sql oracle special-characters

当我试图将Özyeğin大学保存到oracle数据库时,它保存为ÖzyeğinUniversity=> ğ=ğ

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

任何想法

1 个答案:

答案 0 :(得分:4)

不确定这在屏幕上看起来如何;在我的(使用默认美国设置)字符完全相同。话虽如此:通常问题不是数据库字符集(在服务器上),而是前端字符集(客户端) - 在输入时或在检索时(或两者)。要查看存储在数据库中的确切字符,请使用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数据库中的TABLE,而不是像我的例子中那样动态构建的。col_name是包含大学名称的列的名称。)

为了说明问题,这里是SQL * Plus中的一个简短会话。请注意如何使用我的标准字符集(请参阅下面的评论 - 我的默认值是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 ...)