Проблема Oracle Unicode при использовании NLS_CHARACTERSET - это WE8ISO8859P1, а NLS_NCHAR_CHARACTERSET - это AL16UTF16, а ColdFusion в качестве языка программирования - PullRequest
5 голосов
/ 23 февраля 2011

У меня есть 2 базы данных Oracle 10g, XE и Enterprise

Х

enter image description here

enter image description here

Предприятие

enter image description here

enter image description here

и это тип данных, который я использую в тестовой таблице

enter image description here

enter image description here

и затем я попытался проверить, чтобы вставить какой-нибудь символ Unicode из http://www.sustainablegis.com/unicode/

и результаты

Х

enter image description here

Предприятие

enter image description here

для этого теста я использую 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>

из этого руководства http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10749/ch6unicode.htm#i1007297 Я думаю, что для моей базы данных Enterprise она должна производить то же самое, что и XE (по крайней мере для столбца NVARCHAR2), поскольку типичное решение из этого руководства говорит:

  • Использование типов данных NCHAR и NVARCHAR2 для хранения символов Юникода
  • Сохранить WE8ISO8859P1 в качестве набора символов базы данных
  • Используйте AL16UTF16 в качестве национального набора символов

Итак, как заставить это работать в моей базе данных Enterprise?

Спасибо :)

Ответы [ 4 ]

1 голос
/ 18 марта 2014

Кодировка WE8ISO88591 имеет ограниченный набор символов и не может хранить все символы Unicode. Пожалуйста, обратитесь к http://en.wikipedia.org/wiki/ISO/IEC_8859-1 для списка поддерживаемых символов.

1 голос
/ 26 февраля 2013

Первая база данных хранит значения в кодировке utf-8, вторая - в iso-8859-1 (кроме N-типов данных), однако вы записываете оба значения в utf-8, поэтому первое из них в порядке, а второе неправильно декодировано .

0 голосов
/ 24 июля 2012

У компонента NVARCHAR2 в сочетании с WE8ISO88591 есть неприятный побочный эффект, если вы используете литералы в запросах.Весь запрос конвертируется через кодировку NLS_CHARSET, поэтому, если он не может кодировать ваши символы, у вас могут возникнуть проблемы.Но это не должно происходить со связанными параметрами.

0 голосов
/ 25 февраля 2011

Первым шагом является проверка переменных среды NLS, поскольку они определяют преобразование (при необходимости).Также проверьте содержимое для NLS_SESSION_PARAMETERS на странице холодной плавки.

...