使用 NLS_CHARACTERSET 为 WE8ISO8859P1 且 NLS_NCHAR_CHARACTERSET 为 AL16UTF16 且使用 ColdFusion 作为编程语言时出现 Oracle Unicode 问题
我有 2 个 Oracle 10g 数据库,XE 和 Enterprise
XE
企业
这是我在测试表
,然后我尝试测试从 http://www. Sustainablegis.com/unicode/
结果是
XE
企业
对于此测试,我使用
<cfprocessingDirective pageencoding="utf-8">
<cfset setEncoding("form","utf-8")>
<form action="" method="post">
Unicode : <br>
<textarea name="txaUnicode" id="txaUnicode" cols="50" rows="10"></textarea>
<br><br>
Language : <br>
<input type="Text" name="txtLanguage" id="txtLanguage">
<br><br>
<input type="Submit">
</form>
<cfset dsn = "theDSN">
<cfif StructKeyExists(FORM, "FIELDNAMES")>
<cfquery name="qryInsert" datasource="#dsn#">
INSERT INTO UNICODE
(
C_VARCHAR2,
C_CHAR,
C_CLOB,
C_NVARCHAR2,
LANGUAGE
)
VALUES
(
<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.TXAUNICODE#">,
<cfqueryparam cfsqltype="CF_SQL_CHAR" value="#FORM.TXAUNICODE#">,
<cfqueryparam cfsqltype="CF_SQL_LONGVARCHAR" value="#FORM.TXAUNICODE#">,
<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.TXAUNICODE#">,
<cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#FORM.TXTLANGUAGE#">
)
</cfquery>
</cfif>
<cfquery name="qryUnicode" datasource="#dsn#">
SELECT *
FROM UNICODE
ORDER BY LANGUAGE
</cfquery>
<table border="1">
<thead>
<tr>
<th>LANGUAGE</th>
<th>C_VARCHAR2</th>
<th>C_CHAR</th>
<th>C_CLOB</th>
<th>C_NVARCHAR2</th>
</tr>
</thead>
<tbody>
<cfoutput query="qryUnicode">
<tr>
<td>#qryUnicode.LANGUAGE#</td>
<td>#qryUnicode.C_VARCHAR2#</td>
<td>#qryUnicode.C_CHAR#</td>
<td>#qryUnicode.C_CLOB#</td>
<td>#qryUnicode.C_NVARCHAR2#</td>
</tr>
</cfoutput>
</tbody>
</table>
本指南中的 ColdFusion 9 开发人员版本 < a href="http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10749/ch6unicode.htm#i1007297" rel="noreferrer">http://www.stanford。 edu/dept/itss/docs/oracle/10g/server.101/b10749/ch6unicode.htm#i1007297 我认为对于我的企业数据库,它应该产生与 XE 相同的东西(至少对于 NVARCHAR2 列),因为 <该指南中的strong>典型解决方案说:
- 使用 NCHAR 和 NVARCHAR2 数据类型来存储 Unicode 字符
- 保留 WE8ISO8859P1 作为数据库字符集
- 使用 AL16UTF16 作为国家字符集
那么,如何使其在我的企业数据库中也能工作?
谢谢 :)
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(4)
第一个数据库以 utf-8 编码存储值,第二个数据库以 iso-8859-1 编码存储值(除了 N 数据类型),但是您正在以 utf-8 写出这两个值,因此第一个数据库没问题,但第二个数据库解码错误。
First database stores values in utf-8 encoding, second in iso-8859-1(besides N-datatypes), however you are writing out both values in utf-8 so first one is alright, but second one is wrong decoded.
WE8ISO88591编码的字符集有限,不能存储所有unicode字符。请参考http://en.wikipedia.org/wiki/ISO/IEC_8859-1< /a> 获取支持的字符列表。
WE8ISO88591 encoding has a limited character set and can not store all unicode characters. Please refer to http://en.wikipedia.org/wiki/ISO/IEC_8859-1 for list of supported characters.
第一步是检查 NLS 环境变量,因为它们决定转换(如果需要)。另请检查 NLS_SESSION_PARAMETERS 内的内容一个冷融合页面。
The first step is to check the NLS environment variables because they determine the conversion (if needed). Also check the contents for NLS_SESSION_PARAMETERS inside a coldfussion page .
如果您在查询中使用文字,则 NVARCHAR2 与 WE8ISO88591 结合会产生令人讨厌的副作用。整个查询通过 NLS_CHARSET 编码进行转换,因此如果它无法对您的字符进行编码,您可能会遇到麻烦。但对于绑定参数来说,这种情况不应该发生。
The NVARCHAR2 thing combined with WE8ISO88591 has a nasty side effect if you use literals in queries. The whole query is converted through the NLS_CHARSET encoding, so if it cannot encode your characters you might be in trouble. But that should not happen with bound paramters.