Oracle de XMLDB #7 - 何かが違う!? Tweet
前回、何かが違うと感じたと書いたがそれはなにか? 実はwhitespaceに関することだった。(OTN-Jへ投稿したものの、XMLの部屋の状況を見ているだけに、レスは付かないかもしれないな〜と思いつつも、ダメもとで、とりあえず尋ねてみた。)
バックナンバー:
Oracle de XMLDB #1
Oracle de XMLDB #2
Oracle de XMLDB #3 - Oracle10g XEではどうよ?
Oracle de XMLDB #4 - fizzbuzzから
Oracle de XMLDB #5 - Oracle11g環境再構築完了
Oracle de XMLDB #6 - Linux x86版再び。
前置きはこのくらいにして、
初めてこの違いに気付いたのはWindows環境で遊び始めたときだった。Windows環境ではデータベースキャラクタセットはAL32UTF8、SQL*Plusは当然ながらJA16SJISになっている。データベースキャラクタセットとClientのNLS_LANGが異なるとコード変換が発生して、XMLはUTF-8からSHIFT_JISへ変換されて帰ってくる。まあ、エンコードが違う程度なら驚かなかったと思うのだが、whitespace strip/preserveまで異なると、見た目が違うので、あれれ???? と驚いてしまったわけなのですよ。
(Oracle10gでも似たような話はあったので理由は同じなのかもしれないですが・・)
注)OTN-Jのフォーラムへ投稿した内容は、以降に記載した内容を再編集したものです。
まずは、XMLファイルの登録。(windows/Linux環境とも全く同じことをやってます。)
●test1.xml
<?xml version="1.0" encoding="UTF-8"?>
<テスト>
<内容>あいうえお</内容>
</テスト>
●test2.xml
<?xml version="1.0" encoding="UTF-8"?>
<test>
<content>abcdefg</content>
</test>
●上記XMLファイルを以下のようにしてXMLリポジトリへ登録。
SCOTT> l
1 declare
2 r boolean;
3 begin
4 r := dbms_xdb.createresource(
5 '/public/scott/xml/test1.xml',
6 bfilename('SCOTT_XMLDIR','test1.xml'),
7 nls_charset_id('AL32UTF8'));
8 r := dbms_xdb.createresource(
9 '/public/scott/xml/test2.xml',
10 bfilename('SCOTT_XMLDIR','test2.xml'),
11 nls_charset_id('AL32UTF8'));
12* end;
SCOTT> /
PL/SQLプロシージャが正常に完了しました。
SCOTT> commit;
コミットが完了しました。
● Windows版Oracle11g(データベースキャラクタセット:AL32UTF8, NLS_LANG=japanese_japan.JA16SJIS)
文字エンコーディング以外は元のXMLファイルを再現している。
SCOTT> xquery
2 let $d := fn:doc("/public/scott/xml/test1.xml")
3 return $d
4 /
Result Sequence
------------------------------------------------------------------------------
<?xml version="1.0" encoding="SHIFT_JIS"?>
<テスト>
<内容>あいうえお</内容>
</テスト>
SCOTT> xquery
2 let $d := fn:doc("/public/scott/xml/test2.xml")
3 return $d
4 /
Result Sequence
------------------------------------------------------------------------------
<?xml version="1.0" encoding="SHIFT_JIS"?>
<test>
<content>abcdefg</content>
</test>
● Linux版Oracle11g(データベースキャラクタセット;AL32UTF8、NLS_LANG=japanese_japan.AL32UTF8)
文字エンコーディングは元のXMLファイルを再現しているが、whitespaceは取り除かれている。
SCOTT> l
1 xquery
2 let $d := fn:doc("/public/scott/xml/test1.xml")
3* return $d
SCOTT> /
Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><テスト><内容>あいうえお</内容></テスト>
SCOTT> xquery
2 let $d := fn:doc("/public/scott/xml/test2.xml")
3 return $d
4 /
Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="UTF-8"?><test><content>abcdefg</content></test>
SCOTT>
ということは、Linux環境であってもデータベースキャラクタセットとクライアントの文字エンコーディングが異なれば同じ結果になるのでは???
試してみた!
[oracle@corydoras ˜]$ export NLS_LANG=american_america.JA16SJISTILDE
[oracle@corydoras ˜]$ sqlplus /nolog
SQL*Plus: Release 11.1.0.6.0 - Production on Mon Oct 29 22:45:09 2007
Copyright (c) 1982, 2007, Oracle. All rights reserved.
> conn scott/tiger
Connected.
SCOTT> set long 4000
SCOTT> l
1 xquery
2 let $d := doc("/public/scott/xml/test2.xml")
3* return $d
SCOTT> /
Result Sequence
--------------------------------------------------------------------------------
<?xml version="1.0" encoding="SHIFT_JIS"?>
<test>
<content>abcdefg</content>
</test>
XMLマスタープロフェッショナル(データベース)取得へ向けて勉強しようと思っていたのだが、なんだか、どんどん別な方向へ行っている気がするのでこの辺で止めておこうかと。
(XMLのデータの再現性という点についてはちょうどいいネタでしたけどね。。)
ちなみに、XQueryの勉強用には、結果が確認しやすくなるのでデータベースキャラクタセットとNLS_LANGのエンコードは変えておいたほういいかもしれないですね。
ということで、Windows版Oracle11gは不要なので即削除ということに。うちではLinux環境の方が便利なのでね。。。(明日にはOTN Professional版のOracle11gが届きそうなのでまた入れ直すだろうけど。。)
※尚、OTN-Jでレスが付いたらこのエントリに追記する予定。
| 固定リンク | 0
コメント