Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/mercurial/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
如何存储®;在oracle表中?_Oracle_Character Encoding_Special Characters - Fatal编程技术网

如何存储®;在oracle表中?

如何存储®;在oracle表中?,oracle,character-encoding,special-characters,Oracle,Character Encoding,Special Characters,我需要在Oracle表中插入值 “RR'5” 我创建了一个表列varchar2数据类型。 但当我显示数据时,它会显示: “RR??5' 有什么想法吗?首先,您必须检查您的数据库是否使用支持您的特殊字符的字符编码 执行此查询以进行检查 SELECT * FROM V$NLS_PARAMETERS WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET'); 像AL32UTF8,UTF8,WE8ISO8859P1这样的字符

我需要在Oracle表中插入值 “
RR'5

我创建了一个表列
varchar2
数据类型。 但当我显示数据时,它会显示: “
RR??5
'


有什么想法吗?

首先,您必须检查您的数据库是否使用支持您的特殊字符的字符编码

执行此查询以进行检查

SELECT * 
FROM V$NLS_PARAMETERS 
WHERE PARAMETER IN ('NLS_CHARACTERSET', 'NLS_NCHAR_CHARACTERSET');
AL32UTF8
UTF8
WE8ISO8859P1
这样的字符集能够存储特殊字符
。
为了检查是否支持您的字符,您可以运行此命令

SELECT 
    ASCIISTR(CAST(UNISTR('\00C2') AS VARCHAR2(4))) AS VARCHAR_SUPPORT, 
    ASCIISTR(CAST(UNISTR('\00C2') AS NVARCHAR2(4))) AS NVARCHAR_SUPPORT
FROM dual;


VARCHAR_SUPPORT   NVARCHAR_SUPPORT                        
----------------  ------------------------
\00C2             \00C2                                   

1 row selected.
C:\>REM for x64 Oracle Client

c:\>reg query HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ /s /v NLS_LANG

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1
    NLS_LANG    REG_SZ    AMERICAN_SWITZERLAND.AL32UTF8

End of search: 1 match(es) found.    

C:\>REM for x86 Oracle Client

c:\>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\ /s /v NLS_LANG

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1
    NLS_LANG    REG_SZ    AMERICAN_SWITZERLAND.AL32UTF8

End of search: 1 match(es) found.

C:\>
如果结果值(
00C2
)等于输入值,则支持您的字符

假设您的数据库支持这些角色(否则游戏到此结束)

解决方案1

从任何SQL编辑器或SQL*plus运行此命令

INSERT INTO THE_TABLE VALUES (UNISTR('RR\00C2\00AE 5'));
根据您的实际需求,这可能是一项非常乏味的工作

解决方案2

使用SQL*plus命令。为此,您必须根据
cmd

C:\>chcp
Active code page: 850

C:\>set NLS_LANG=.WE8PC850

C:\>sqlplus user/pwd@DB

SQL> INSERT INTO THE_TABLE VALUES ('®');
在Linux/Unix上工作时,
chcp
等效于
locale charmap
echo$LANG
。您还可以更改当前代码页,例如UTF-8的chcp 65001

解决方案3a

创建一个SQL脚本,其中包含与上述相同的INSERT命令,并使用本地编码保存它(通常为
Windows CP1252
,多次错误命名为
ANSI

解决方案3b

创建一个SQL脚本并使用UTF-8保存它,大多数现代编辑器都支持UTF-8。注意:SQL脚本不能包含BOM(字节顺序标记),否则SQL*plus将引发错误。我发现这个小小的命令行工具可以从任意文本文件中添加和删除BOM表:

注意上述解决方案:如果注册表已相应设置,则可以跳过
set NLS\u LANG
命令。使用此命令进行检查

SELECT 
    ASCIISTR(CAST(UNISTR('\00C2') AS VARCHAR2(4))) AS VARCHAR_SUPPORT, 
    ASCIISTR(CAST(UNISTR('\00C2') AS NVARCHAR2(4))) AS NVARCHAR_SUPPORT
FROM dual;


VARCHAR_SUPPORT   NVARCHAR_SUPPORT                        
----------------  ------------------------
\00C2             \00C2                                   

1 row selected.
C:\>REM for x64 Oracle Client

c:\>reg query HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\ /s /v NLS_LANG

HKEY_LOCAL_MACHINE\SOFTWARE\ORACLE\KEY_OraClient11g_home1
    NLS_LANG    REG_SZ    AMERICAN_SWITZERLAND.AL32UTF8

End of search: 1 match(es) found.    

C:\>REM for x86 Oracle Client

c:\>reg query HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\ /s /v NLS_LANG

HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\ORACLE\KEY_OraClient11g_home1
    NLS_LANG    REG_SZ    AMERICAN_SWITZERLAND.AL32UTF8

End of search: 1 match(es) found.

C:\>
解决方案4

从更复杂的编辑器(如TOAD或SQL Developer)运行INSERT语句。确保注册表中的NLS_LANG值分别为。系统环境变量与编辑器的文件保存选项匹配

一些可能帮助您的外部资源:

  • Oracle文档

  • 代码页列表:

  • 查找Unicode代码点:


出于好奇,可能存在重复,
RR'5
是真实值,还是您在伪造数据,因为该列是用“错误”编码定义的?这看起来很像。。。