Update/insert/retrieve DB 中的重音字符?
Update/insert/retrieve accented character in DB?
我用的是oracle 12G
当我从 sql 运行 @F:\update.sql
加上它显示重音字符 é
当我从 sqlplus 或 sql 开发人员
由当 运行 来自 sql 的个人陈述加上。现在,如果我从 sqlplus 检索它,它会显示正确的字符,但是当我从 sqldeveloper 检索它时,它再次显示垃圾字符。
update.sql内容是这样
update employee set name ='é' where id= 1;
我想要的是当我 运行 @F:\update.sql 时,它应该 insert/update/retrieve 格式正确,无论它来自 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 开发人员,但我可以为 SQL*Plus 提供解决方案。
假设您喜欢在 Windows CP1252
工作
首先确保文件F:\update.sql
是以CP1252编码保存的。许多编辑称这种编码为ANSI
,这是相同的(让我们跳过术语ANSI
和Windows-1252
之间的区别的细节)
然后在 运行 脚本之前输入
chcp 1252
为了将 cmd.exe
的编码切换为 CP1252。默认情况下 cmd.exe
的编码很可能是 CP850 or CP437,它们是不同的。
然后设置NLS_LANG
环境变量为字符集WE8MSWIN1252
,例如
set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
之后您的脚本应该可以与 SQL*Plus 一起正常工作。 SQL*Plus 从父 cmd.exe
继承编码(或 "character set",如果你喜欢这个术语)。 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 开发人员检查您的选项,应该可以在某个地方定义 SQL 文件的编码。
你不是被迫使用Windows-1252。这同样适用于其他编码,例如 WE8ISO8859P1
(即 ISO-8859-1、chcp 28591
)或 UTF-8。但是,如果是 UTF-8,您的 SQL-script 可能包含数据库字符集 WE8MSWIN1252 不支持的字符。这些字符将被占位符替换(例如 ¿
)。
我用的是oracle 12G
当我从 sql 运行 @F:\update.sql
加上它显示重音字符 é
当我从 sqlplus 或 sql 开发人员
由当 运行 来自 sql 的个人陈述加上。现在,如果我从 sqlplus 检索它,它会显示正确的字符,但是当我从 sqldeveloper 检索它时,它再次显示垃圾字符。
update.sql内容是这样
update employee set name ='é' where id= 1;
我想要的是当我 运行 @F:\update.sql 时,它应该 insert/update/retrieve 格式正确,无论它来自 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 开发人员,但我可以为 SQL*Plus 提供解决方案。
假设您喜欢在 Windows CP1252
工作首先确保文件F:\update.sql
是以CP1252编码保存的。许多编辑称这种编码为ANSI
,这是相同的(让我们跳过术语ANSI
和Windows-1252
之间的区别的细节)
然后在 运行 脚本之前输入
chcp 1252
为了将 cmd.exe
的编码切换为 CP1252。默认情况下 cmd.exe
的编码很可能是 CP850 or CP437,它们是不同的。
然后设置NLS_LANG
环境变量为字符集WE8MSWIN1252
,例如
set NLS_LANG=AMERICAN_AMERICA.WE8MSWIN1252
之后您的脚本应该可以与 SQL*Plus 一起正常工作。 SQL*Plus 从父 cmd.exe
继承编码(或 "character set",如果你喜欢这个术语)。 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 开发人员检查您的选项,应该可以在某个地方定义 SQL 文件的编码。
你不是被迫使用Windows-1252。这同样适用于其他编码,例如 WE8ISO8859P1
(即 ISO-8859-1、chcp 28591
)或 UTF-8。但是,如果是 UTF-8,您的 SQL-script 可能包含数据库字符集 WE8MSWIN1252 不支持的字符。这些字符将被占位符替换(例如 ¿
)。