【问题标题】:Update/insert/retrieve accented character in DB?更新/插入/检索数据库中的重音字符?
【发布时间】:2016-11-22 12:23:30
【问题描述】:

我正在使用 oracle 12G

当我从 sqlplus 运行 @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]"

【问题讨论】:

    标签: sql oracle sqlplus


    【解决方案1】:

    我不熟悉 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 不支持的字符。此类字符将被占位符替换(例如¿)。

    【讨论】:

    • 它不起作用。我所做的是 1) 打开 CMD 2) 运行 chcp 1252 输出 Active code page: 1252 3) 然后我运行 @F:\update.sql 4) 我检索更新的数据,它再次给了我垃圾代码
    • 我试过set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252 但没有任何区别?
    • 是的,我 100% 确定它已保存为 ANSI。您能在最后尝试一下吗?
    • select dump(name, 1016) from employee where id= 1; 得到了什么
    • 它给出了inconsistent datatypes: expected - got CLO。实际上名称列是 clob
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-02-21
    • 2014-01-06
    相关资源
    最近更新 更多