当前位置: 首页 > 面试题库 >

将国家字符插入到Oracle NCHAR或NVARCHAR列中不起作用

诸葛茂勋
2023-03-14
问题内容

在oracle数据库中插入字符串时,即使将某些国家字符插入到NCHAR或NVARCHAR列中也应使用问号替换,该字符应能够处理所有Unicode字符。

使用Oracle的SQL Developer,sqlplus或使用JDBC驱动程序都会发生这种情况。

数据库NLS_CHARACTERSET设置为WE8ISO8859P1(西欧iso-8859-1)。用于NCHAR列的NLS_NCHAR_CHARACTERSET设置为AL16UTF16。(UTF-16)

不在NLS_CHARACTERSET中的任何字符似乎都被反问号代替。


问题答案:

编辑:请注意,在Oracle上处理UTF的最佳方法是使用数据库字符集AL32UTF8创建数据库,并使用普通的varchar2列。使用nchar列的问题之一是,默认情况下将参数作为nchar发送时,oracle无法为普通char
/ varchar2列使用索引。

无论如何:如果您不能转换数据库:

首先,unicode字面量需要以“ n”作为前缀,如下所示:

select n'Language - Språk - Język' from dual;

*)8位编码无法处理此文本

不幸的是,这还不够。

由于某种原因,数据库客户端的默认行为是将所有字符串文字转换为数据库字符集,这意味着即使在数据库看到字符串之前,值也将被更改。

客户端需要一些配置,以便能够将Unicode字符插入NCHAR或NVARCHAR列:

Unix上的SQL Plus

这些environemnet变量将Unix环境和sqlplus设置为使用UTF-8文件,还将sqlplus配置为以unicode发送字符串文字。

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
LC_CTYPE="en_US.UTF-8"
ORA_NCHAR_LITERAL_REPLACE=true

(en_US.UTF-8用于Solaris-Linux或其他系统可能需要不同的字符串,用于locale -a列出支持的语言环境。)

JDBC驱动程序

使用Oracle JDBC驱动程序的应用程序需要定义以下系统属性,才能以unicode发送字符串文字。

-Doracle.jdbc.defaultNChar=true 
-Doracle.jdbc.convertNcharLiterals=true

SQL开发人员

找到sqldeveloper.conf,并添加以下行:

AddVMOption -Doracle.jdbc.defaultNChar=true 
AddVMOption -Doracle.jdbc.convertNcharLiterals=true

Microsoft Windows上的SQL Plus

我没有尝试过Microsoft
Windows或Toad上的SQLplus是否完全可以处理utf-8。Sqlplusw.exe可能会这样做,而以下注册表设置可能会成功。

NLS_LANG=AMERICAN_AMERICA.AL32UTF8
ORA_NCHAR_LITERAL_REPLACE=true


 类似资料:
  • 问题内容: 在给定SQL Server 2012的情况下,如何在SQL脚本的nvarchar或varchar列中插入控制字符(以ASCII 32编码的字符,如TAB,CR,LF)? 问题答案: 除非我在问题中遗漏任何东西,否则可以使用TSQL CHAR()函数执行此操作: 将插入CR / LF。其他代码也一样。 编辑 那里还有TSQL NCHAR()以及Unicode字符。

  • 问题内容: 我正在使用 Ubuntu 9.04 我已经安装了以下软件包版本: 我已经这样配置: 我已经这样配置: 我已经从Pyodbc修订版中获取并使用“ ”进行了安装 我有一台装有 Microsoft SQL Server 2000 的Windows机器,安装在本地网络上,并在本地IP地址10.32.42.69上侦听。我有一个名为“ Common”的空数据库。我的用户“ sa”具有完全特权的密码

  • 问题内容: 我没有看到与此主题相关的任何类似问题,因此我不得不针对当前正在研究的内容进行研究。我以为如果其他人有相同的问题,我会给出答案。 问题答案: 您只需将字符串连接起来,然后CHAR(13)在要换行的位置插入一个即可。 例子: 打印出以下内容: This is line 1. This is line 2.

  • 我想从Java应用程序通过套接字发送一个简单的。我的问题是,如果不在的末尾添加'\n',编写就不起作用。我必须添加这个“\n”还是有更优雅的解决方案? 这是我的代码:

  • 问题内容: INSERT INTO EMP_1 (EMP_NUM, EMP_LNAME, EMP_FNAME, EMP_INITIAL, EMP_HIREDATE, JOB_CODE) VALUES (‘101’, ‘News’, ‘John’, ‘G’, ‘08-Nov-00’, ‘502’), (‘102’, ‘Senior’, ‘David’, ‘H’, ‘12-Jul-89’, ‘501’

  • 我通过“vagrant up”命令运行了我的虚拟机,一切正常。“vagrant ssh”工作正常,ifconfig的输出为: 我的Homestead.yaml是: 但是当我尝试浏览我的Web应用程序时,它不起作用。我试过了http://prova.app, 192.168.10.10:8000, 127.0.0.1:8000, http://localhost:8000但它仍然不起作用。 我的主机