我正在使用oracle 12G
当我从sql运行@F:\update.sql
时,当我从sqlplus或sql developer中检索时,它将重音字符é
显示为垃圾字符
从sql plus运行单个语句时。现在,如果我从sqlplus中检索它,它会显示正确的字符,但是当我从sqldeveloper中检索它时,它会再次显示垃圾字符。
update.sql内容就是这个
update employee set name ='é' where id= 1;
我想要的是当我运行@F:\ update.sql时,它应该以正确的格式插入/更新/检索它是否来自sqlplus或任何其他工具?
有关信息: - 当我跑
时 SELECT * FROM NLS_DATABASE_PARAMETERS WHERE PARAMETER LIKE '%CHARACTERSET%'
我得到以下信息
PARAMETER VALUE
------------------------------ ----------------------------------------
NLS_CHARACTERSET WE8MSWIN1252
NLS_NCHAR_CHARACTERSET AL16UTF16
当我从命令提示符运行@.[%NLS_LANG%]
时,我看到
SP2-0310: unable to open file ".[AMERICAN_AMERICA.WE8MSWIN1252]"
答案 0 :(得分:2)
我不熟悉SQL Developer,但我可以为SQL * Plus提供解决方案。
假设你想在Windows CP1252
中工作首先确保文件F:\update.sql
以CP1252编码保存。许多编辑称这种编码ANSI
是相同的(让我们跳过有关术语ANSI
和Windows-1252
之间差异的详细信息)
然后在运行脚本之前输入
chcp 1252
为了将cmd.exe
的编码切换为CP1252。默认情况下,cmd.exe
的编码最有可能是CP850或CP437。
然后将NLS_LANG
环境变量设置为字符集WE8MSWIN1252
,例如
set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
之后,您的脚本应该可以正常使用SQL * Plus。 SQL * Plus从父cmd.exe
继承编码(或“字符集”,如果您更喜欢这个术语)。 NLS_LANG
告诉Oracle驱动程序您正在使用哪个字符集。
示例摘要:
chcp 1252
set NLS_LANG=.WE8MSWIN1252
sqlplus username/password@db @F:\update.sql
一些注意事项:要永久设置cmd.exe
的编码,请参阅以下答案:Unicode characters in Windows command line - how?
NLS_LANG
可以设置为环境变量,也可以设置在HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(适用于32位Oracle客户端)的注册表中。 HKLM\SOFTWARE\ORACLE\KEY_%ORACLE_HOME_NAME%\NLS_LANG
(对于64位Oracle客户端)。
对于SQL Developer,请检查选项,在某处可以定义SQL文件的编码。
您不必使用Windows-1252。同样适用于其他编码,例如WE8ISO8859P1
(即ISO-8859-1,chcp 28591
)或UTF-8。但是,对于UTF-8,您的SQL脚本可能包含数据库字符集WE8MSWIN1252不支持的字符。此类字符将替换为占位符(例如¿
)。