使用 NLS_CHARACTERSET 为 WE8ISO8859P1 且 NLS_NCHAR_CHARACTERSET 为 AL16UTF16 且使用 ColdFusion 作为编程语言时出现 Oracle Unicode 问题

发布于 2024-10-18 14:08:52 字数 3535 浏览 3 评论 0 原文

我有 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 作为国家字符集

那么,如何使其在我的企业数据库中也能工作?

谢谢 :)

I have 2 Oracle 10g database, XE and Enterprise

XE

enter image description here

enter image description here

Enterprise

enter image description here

enter image description here

and this are the data type I've use in the test table

enter image description here

enter image description here

and then I tried to test to insert some Unicode char from http://www.sustainablegis.com/unicode/

and the results are

XE

enter image description here

Enterprise

enter image description here

for this test, I use ColdFusion 9 developer edition

<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>

from this guide http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10749/ch6unicode.htm#i1007297 I think for my Enterprise database it should produce same thing as XE (at least for NVARCHAR2 column) since the typical solution from that guide said:

  • Use NCHAR and NVARCHAR2 datatypes to store Unicode characters
  • Keep WE8ISO8859P1 as the database character set
  • Use AL16UTF16 as the national character set

So, how to make it works too in my Enterprise database?

Thank you
:)

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(4

冷清清 2024-10-25 14:08:52

第一个数据库以 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.

蒗幽 2024-10-25 14:08:52

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.

梦中楼上月下 2024-10-25 14:08:52

第一步是检查 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 .

逆蝶 2024-10-25 14:08:52

如果您在查询中使用文字,则 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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文