如何存储®;在oracle表中?
我需要在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这样的字符
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
是真实值,还是您在伪造数据,因为该列是用“错误”编码定义的?这看起来很像。。。