Sql 更新/插入/检索数据库中的重音字符?

Sql 更新/插入/检索数据库中的重音字符?,sql,oracle,sqlplus,Sql,Oracle,Sqlplus,我正在使用oracle 12G 当我从sqlplus运行@F:\update.sql时,当我从sqlplus或sqldeveloper检索时,它将重音字符显示为垃圾字符 当从sql plus运行单个语句时。现在,如果我从sqlplus检索它,它将显示正确的字符,但是当我从sqldeveloper检索它时,它将再次显示垃圾字符 update.sql内容是什么 update employee set name ='é' where id= 1; 我想要的是,当我运行@F:\update.sql时,

我正在使用oracle 12G

当我从sqlplus运行
@F:\update.sql
时,当我从sqlplus或sqldeveloper检索时,它将重音字符
显示为垃圾字符

当从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\u LANG%]
时,我看到

SP2-0310: unable to open file ".[AMERICAN_AMERICA.WE8MSWIN1252]"

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

假设你喜欢在Windows中工作

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

然后在运行脚本之前输入

chcp 1252

以便将
cmd.exe的编码切换为CP1252。默认情况下,
cmd.exe
的编码很可能是不同的

然后将
NLS_LANG
环境变量设置为字符集
WE8MSWIN1252
,例如

设置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的编码,请参阅以下答案:

NLS\u LANG
可以设置为环境变量,也可以在注册表中分别设置为
HKLM\SOFTWARE\Wow6432Node\ORACLE\KEY\u%ORACLE\u HOME\u NAME%\NLS\u LANG
(适用于32位ORACLE客户端)
HKLM\SOFTWARE\ORACLE\KEY\%ORACLE\u HOME\u NAME%\NLS\u LANG
(适用于64位ORACLE客户端)

对于SQL开发人员,请检查选项,在某个地方应该可以定义SQL文件的编码


您不必被迫使用Windows-1252。这同样适用于其他编码,例如
WE8ISO8859P1
(即ISO-8859-1,
chcp 28591
)或UTF-8。但是,对于UTF-8,SQL脚本可能包含数据库字符集WE8MSWIN1252不支持的字符。这些字符将被占位符替换(例如,
)。

它不起作用。我所做的是1)打开CMD 2)运行
chcp 1252
,输出
活动代码页:1252
3)然后运行
@F:\update.sql
4)检索更新的数据,它又给了我垃圾代码我试过
设置NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
但没有任何区别?是的,我100%确定它被保存为ANSI。你能在你这边试试吗?你从id=1的员工那里通过
选择dump(name,1016)得到什么
它给出了
不一致的数据类型:预期-获得CLO
。实际上,名称列是clob