在DB中更新/插入/检索重音字符?

时间:2016-11-22 12:23:30

标签: sql oracle sqlplus

我正在使用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]"

1 个答案:

答案 0 :(得分:2)

我不熟悉SQL Developer,但我可以为SQL * Plus提供解决方案。

假设你想在Windows CP1252

中工作

首先确保文件F:\update.sql以CP1252编码保存。许多编辑称这种编码ANSI是相同的(让我们跳过有关术语ANSIWindows-1252之间差异的详细信息)

然后在运行脚本之前输入

chcp 1252

为了将cmd.exe的编码切换为CP1252。默认情况下,cmd.exe的编码最有可能是CP850CP437

然后将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不支持的字符。此类字符将替换为占位符(例如¿)。