在 Oracle 中生成新的 XMLTYPE 时保留 UTF8 编码

Keep UTF8 encoding when generating a new XMLTYPE in Oracle

我有一个游标,可以从 table 中检索文本。 然后我有一个 FOR .. 循环在该游标上迭代,并创建一个 XMLTYPE,如下所示:

  TRANSLATION := XMLTYPE('<I18NElement>
                          <i18nElementType>'||ELEMENTTYPE||'</i18nElementType>
                          <key>'||REC.CODE||'</key>
                          <languageCode>'||REC.CODIDI||'</languageCode>
                          <i18nField>
                            <fieldName>commercialName</fieldName>
                          </i18nField>
                          <i18nField>
                            <fieldName>description</fieldName>
                            <translation><![CDATA['||REC.DESCRIPTION||']]></translation>
                          </i18nField>
                          <isDefault>'||BOOLEANDEFAULT||'</isDefault>
                        </I18NElement>');

UTF-8 编码的文本在 REC.DESCRIPTION 字段中。如果我将此文本直接插入另一个 table,编码将保持正确。 但是,当我在另一个 table 中插入 XMLTYPE 时,编码丢失了:

<I18NElement>
  <i18nElementType>Hotel</i18nElementType>
  <key>GUESTI@1036@Hotel@GUESTI#1036</key>
  <languageCode>ES</languageCode>
  <i18nField>
    <fieldName>commercialName</fieldName>
  </i18nField>
  <i18nField>
    <fieldName>description</fieldName>
    <translation><![CDATA[Hotel de playa de 3 estrellas, de gestión familiar desde 1964. Larga experiéncia el en trato familiar con el cliente. Situado en Malgrat de Mar, Costa Barcelona-Maresme, a 80 Km del aeropuerto de Barcelona y a 40 Km del de Girona.

Este hotel, está compuesto por un edificio principal de cuatro plantas y otro anexo de dos, contiene un total de 227 habitaciones. Está situado a solamente 50 metros de la playa y del paseo marítimo y el centro del pueblo está a una distancia de 400 metros.]]></translation>
  </i18nField>
  <isDefault>true</isDefault>
</I18NElement>

原文如下:

Hotel de playa de 3 estrellas, de gestión familiar desde 1964. Larga experiéncia el en trato familiar con el cliente. Situado en Malgrat de Mar, Costa Barcelona-Maresme, a 80 Km del aeropuerto de Barcelona y a 40 Km del de Girona.

Este hotel, está compuesto por un edificio principal de cuatro plantas y otro anexo de dos, contiene un total de 227 habitaciones. Está situado a solamente 50 metros de la playa y del paseo marítimo y el centro del pueblo está a una distancia de 400 metros.

我已经尝试了与 UTL_I18N 实用程序的各种组合,到目前为止没有任何效果。 数据库 NLS_CHARACTERSET 设置为 AL32UTF8

如果您能提供给我任何信息,我们将不胜感激!我在 Whosebug 中发现了很多相关问题,但 none 到目前为止对我有用 ...

原来是 Toad (12.1) XMLTYPE 弹出式编辑器出于某种原因没有显示正确编码的文本。数据插入正确,使用 SQL Developer 没有编码问题。

编辑:不知何故,它看起来像取决于软件版本和 OS。我们有一台机器,Toad 9.7 的编码看起来不错(我有 12.1),另一台机器的 SQL Developer 4.2 和 Ubuntu 也很好,还有一台机器的 none这些显示了正确的编码(这里是 SQL Developer 和 Toad 的屏幕截图):

幸运的是,数据库似乎没有问题,因为我们的 UTF-8 Java 应用程序显示了正确的编码。

虽然有大量时间被扔进了垃圾箱。