Sql 更新/插入/检索数据库中的重音字符?
我正在使用oracle 12G 当我从sqlplus运行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时,
@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