1

NLS 文字エンコーディングが異なるデータベースがいくつかあります。1 つはAL32UTF8(UTF-8) を使用し、もう 1 つはWE8MSWIN1252(Windows 1252) を使用します。はい、これは悪いことです。同じになるように、物事を正すように働きかけます。それまでの間、非 ASCII 文字を含む SQL を作成する必要があります。たとえば、U+00E1Unicode の á を使用する必要があります。UTF-8 では 16 進値0xC3A1で表され、Windows 1252 では 16 進値で表されます0x00E1。(つまり、それらはバイト値です。)

したがって、これにより、UTF-8 データベースで必要なものが得られます。

SELECT CHR(TO_NUMBER('C3A1', 'xxxx')) FROM DUAL;

これにより、Windows 1252 データベースで必要なものが得られます。

SELECT CHR(TO_NUMBER('00E1', 'xxxx')) FROM DUAL;

ただし、Oracleに1つだけを取得して正しいエンコーディングに変換させる方法を理解できないようです。最終的にどの表現を使用するかはあまり気にしません。同じスクリプトを両方のデータベースで実行する必要があるため、1 つの 16 進数値のみを使用したいだけです。どうやってやるの?

Oracle 11g を使用しています。(残念ながら、今のところ 1 つは 11.1 で、もう 1 つは 11.2 です。)

4

1 に答える 1

5

UNISTR次の 2 つの機能が役立ちますTO_CHAR

  1. データベースの各国語キャラクタ・セットで戻すには:

     SELECT UNISTR('\00E1') FROM DUAL;
    
  2. データベース・キャラクタ・セットで戻すには:

     SELECT TO_CHAR(UNISTR('\00E1')) FROM DUAL;
    

UNISTRのドキュメントから:

UNISTR文字データに解決されるテキスト リテラルまたは式を引数として取り、それを各国語文字セットで返します。データベースの国別文字セットは、AL16UTF16 または UTF8 のいずれかです。UNISTR文字列内の文字の Unicode エンコーディング値を指定できるようにすることで、Unicode 文字列リテラルのサポートを提供します。これは、NCHAR 列にデータを挿入する場合などに便利です。

Unicode エンコード値の形式は '\xxxx' で、'xxxx' は UCS-2 エンコード形式の文字の 16 進値です。補助文字は 2 つのコード単位としてエンコードされます。1 つ目は高サロゲート範囲 (U+D800 から U+DBFF) からのもので、2 つ目は低サロゲート範囲 (U+DC00 から U+DFFF) のものです。バックスラッシュを文字列自体に含めるには、その前に別のバックスラッシュ (\) を付けます。

移植性とデータ保持のために、UNISTR文字列引数には ASCII 文字と Unicode エンコーディング値のみを指定することをお勧めします。

TO_CHAR(文字)ドキュメントから:

TO_CHAR(character)NCHAR、NVARCHAR2、CLOB、または NCLOB データをデータベース文字セットに変換します。返される値は常に VARCHAR2 です。

于 2014-10-15T19:51:15.237 に答える