我需要在Oracle表中插入值
'RR® 5
'?
我创建了一个表格列varchar2
数据类型。
但是,当我显示数据时,它显示:
'RR?? 5
'
请问。
答案 0 :(得分:2)
首先,您必须检查数据库是否运行支持特殊字符的字符编码。
执行此查询以进行检查。
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.
如果您的结果值(00C2
)等于您的输入值,则支持您的字符。
假设您的数据库支持这些字符(否则游戏将在此处结束)
解决方案1
从任何SQL编辑器或SQL * plus
运行此命令INSERT INTO THE_TABLE VALUES (UNISTR('RR\00C2\00AE 5'));
根据您的实际要求,这可能是一项非常繁琐的工作。
解决方案2
使用SQL * plus命令。为此,您必须根据NLS_LANG
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
创建一个包含与上面相同的INSERT命令的SQL脚本,并使用本地编码保存(通常为Windows CP1252
,多次错误命名为ANSI
)
c:\>set NLS_LANG=.WE8MSWIN1252
c:\>sqlplus user/pwd@DB @Special_Char_CP1252.sql
解决方案3b
创建一个SQL脚本并使用大多数现代编辑器支持的UTF-8进行保存。注意:SQL脚本不得包含BOM (字节顺序标记),否则SQL * plus将引发错误。我发现这个小命令行工具可以添加和删除任意文本文件中的BOM:UTF BOM Utils
c:\>set NLS_LANG=.AL32UTF8
c:\>sqlplus user/pwd@DB @Special_Char_UTF8.sql
请注意上述解决方案:如果相应地设置了注册表,则可以跳过set NLS_LANG
命令。检查此命令
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值为resp。您的系统环境变量与编辑器的文件保存选项匹配。
可能对您有所帮助的一些外部资源:
代码页列表:Code page
查找Unicode代码点:Codepoints