<?xml version="1.0" encoding="UTF-8" ?> <rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:trackback="http://madskills.com/public/xml/rss/module/trackback/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/"><channel><title>Oracle</title><link>http://blogs.wankuma.com/oakbow/category/1954.aspx</link><description>Oracle</description><managingEditor>Oakbow</managingEditor><dc:language>ja-JP</dc:language><generator>.Text Version 0.95.2004.102</generator><item><dc:creator>Oakbow</dc:creator><title>[Oracle] 権限管理はどうする？</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179980.aspx</link><pubDate>Sun, 09 Aug 2009 13:16:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179980.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179980.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179980.aspx#Feedback</comments><slash:comments>17</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179980.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179980.aspx</trackback:ping><description>&lt;P&gt;DB の権限管理って、一般的にはデータベースロール、データベースユーザー、データベーススキーマの仕組みを駆使するものだと思っています。&lt;/P&gt;
&lt;P&gt;MS SQL で自分で DB 設計をした過去のWebアプリケーションは、DB アクセスはすべてストアドでした。&lt;BR&gt;ActiveDirectory 環境ではなかったので、Web サーバとDB サーバ双方に ID とパスワードが同じアカウントを作成し、Windows 認証で DB に接続するようにします。&lt;BR&gt;Web アプリケーションは管理側と一般ユーザー側という構成だったので、管理側が実行できる必要のあるストアドに対して EXECUTE 権限のある DB ロールと、一般ユーザー側が実行できる必要のあるストアドに対して EXECUTE 権限のある DB ロールを作成。&lt;BR&gt;実際に Web アプリケーションが接続するユーザーにこのロールを割り当てれば基本的にそれで終わり。&lt;/P&gt;
&lt;P&gt;ストアド内で普通に SELECT とかしているものに関して SELECT 権限を実行者に与えなくてもいいんですが、 sp_executesql などで DynamicSQL 発行してる場合は別。&lt;BR&gt;なので sp_executesql でアクセスしているテーブルやビューなどのデータベースオブジェクトがあるストアドを実行しているユーザーには、必要最低限の CRUD の権限を与えました。&lt;BR&gt;今思えば敢えて sp_executesql 使う必要は全くないストアドばっかだった気がしますが･･･。&lt;BR&gt;SQL インジェクションの脆弱性も出る可能性あるんだし。&lt;/P&gt;
&lt;P&gt;まあ、MS SQL での権限管理はとても簡単でした。&lt;BR&gt;sp_executesql 使ってない場合はストアドの実行権限しか付与しないですみます。&lt;BR&gt;DB からみたらクライアントに相当する Web アプリケーションには一切の CRUD 権限を与えなくていいので、DB 関連のセキュリティにあまり悩まなくていいです。&lt;BR&gt;他にもたくさんある、ストアドを使う利点の一つでしかないですけれど。&lt;/P&gt;
&lt;P&gt;そんな MS SQL での踏まえた後の Oracle。&lt;BR&gt;残念ながらオールストアドという私の野望は達成できなかった上、ビューも禁止されているので、Hibernate 経由ながら直にテーブルアクセスです。&lt;BR&gt;DBアクセスするアプリケーションの構成は、例えるとこんな感じ。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;わんくま運営者･･･システム全体を統括する管理ページ&lt;/LI&gt;
&lt;LI&gt;わんくまメンバー･･･個々のブログの管理ページ&lt;/LI&gt;
&lt;LI&gt;一般ユーザー･･･外部に一般公開されているページ&lt;/LI&gt;
&lt;LI&gt;月次バッチ･･･月初に一回だけ実行されるバッチ処理&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;月次バッチは Web アプリじゃなくて、cron で定期実行される Java アプリ。&lt;BR&gt;管理ページが複数ないことも多いけど、構成としては割と一般的でしょうか。&lt;/P&gt;
&lt;P&gt;Oracle では以下のような権限管理の構成にしてみました。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_ADMIN（DBユーザー）&lt;BR&gt;WANKUMA_ADMIN_ROLE という データベースロールを付与。このロールはわんくま運営者が扱う管理ページで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;直接オブジェクト権限を与えることはしない。&lt;BR&gt;システム権限は CONNECT 権限のみ付与。&lt;BR&gt;ユーザーテーブル領域に対する権限は与えていないので、自スキーマですら CREATE TABLE を行うことは出来ない。&lt;BR&gt;ただし Oracle の仕様により、自スキーマであれば一時表（一時テーブル）を作成することは出来る。&lt;BR&gt;後述する WANKUMA スキーマ内のすべてのテーブルとシーケンスに対して、シノニムを作成。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_MEMBER（DBユーザー）&lt;BR&gt;WANKUMA_MEMBER_ROLE という データベースロールを付与。このロールは個々のブログ保有者が扱う管理ページで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;あとは WANKUMA_ADMIN と同じ。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_GENERAL（DBユーザー）&lt;BR&gt;WANKUMA_GENERAL_ROLE という データベースロールを付与。このロールは一般公開されたページで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;あとは WANKUMA_ADMIN と同じ。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA_BATCH（DBユーザー）&lt;BR&gt;WANKUMA_BATCHL_ROLE という データベースロールを付与。このロールは月次バッチで必要とされる CRUD 操作の権限をまとめたもの。&lt;BR&gt;あとは WANKUMA_ADMIN と同じ。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;このようにして、データベースユーザーとデータベーススキーマを切り離すことが出来ない Oracle で、実質的に DB 接続にしか使用できない、スキーマとしての存在を殺した DBユーザーを作成。&lt;BR&gt;これらとは別に、以下のようなデータベーススキーマを作成しています。&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;WANKUMA&lt;BR&gt;すべてのテーブルはこのスキーマ内に作成。&lt;BR&gt;システム権限は UNLIMITED TABLESPACE のみ付与。&lt;BR&gt;CONNECT 権限を与えていないので、このスキーマ（≒ DB ユーザー）に直接接続することは出来ない。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;こんな感じにして、上とは逆に実質的に DB ユーザーとしての存在を殺して、スキーマとしてしか機能しないって風に。&lt;/P&gt;
&lt;P&gt;正直「Oracleでは普通こういう風にやるよ！」ってのを知らないんですね。&lt;BR&gt;さすがにデータベースオブジェクトの所有者に直接アクセス、とかいうのは無いだろうなあと思っていろいろ考えてたら、こういう形に行き着いたというところ。&lt;BR&gt;「MS SQLだったらこうするよ！」みたいな権限管理ベストプラクティスを知ってるって言えるほどじゃないですけれど、マイクロソフトは結構その手の資料が充実してるので、（多分）なんとかなりました。&lt;BR&gt;Oracle も Books Online に相当する結構膨大な資料があるんですが、あれ読んでても正直よくわからなかったというところ。&lt;BR&gt;メーカーサイドじゃない技術資料は例えば @IT とかにかなり豊富に存在する Oracle ですが、権限管理に関するものは見つけられませんでした。&lt;BR&gt;こういうのは書籍ベースじゃないとなかなかないのかしらん。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179980.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Oracle] 照合順序はどう使う？</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179972.aspx</link><pubDate>Sun, 09 Aug 2009 01:33:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179972.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179972.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179972.aspx#Feedback</comments><slash:comments>3236</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179972.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179972.aspx</trackback:ping><description>&lt;P&gt;MS SQL には照合順序というものがあります。英語で言うと COLLATION でしょうか。&lt;/P&gt;
&lt;P&gt;手っ取り早く言うと文字の大小比較に使う設定で、例えば CS （Case Sensitive）だと大文字小文字を区別するし、CI（Case Ignore）だと区別しません。&lt;/P&gt;
&lt;P&gt;MS SQLの照合順序は日本語だけでもかなりの数があるので、最初はちょっと混乱します。&lt;/P&gt;
&lt;P&gt;若干複雑なところもありますが、使えるようになるととても便利なので、私は COLLATE とか結構多用していました。&lt;/P&gt;
&lt;P&gt;インスタンス、データベース、テーブル、カラム、クエリそれぞれの単位で設定できるでとても便利。&lt;/P&gt;
&lt;P&gt;大文字小文字やひらがなカタカナを区別しないLike検索とかソートとかって結構要求されることが多いし、これをアプリケーション側でちまちま実装するよりかは早くて簡単ですから。&lt;/P&gt;
&lt;P&gt;ただし比較対照のカラムの照合順序があってないとエラーが発生するので、意味が分かっていない当時は結構苦慮していましたけれども。&lt;/P&gt;
&lt;P&gt;一時テーブルの照合順序は確かインストール時の照合順序か何かがデフォルトになるので、一時テーブルと結合するときには注意が必要だったりとかもあったような。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;ちゃんと触ったことはないけど、MySQLにも数は少ないながら照合順序の仕組みはちゃんとあって、テーブルやカラム単位での指定もできるし、COLLATE でクエリ単位で使うことも出来たと思います。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;で、Oracle。&lt;/P&gt;
&lt;P&gt;大文字小文字やひらがなカタカナを区別しないLike検索と、辞書順ソートの要求はやっぱりあったので、MS SQLと同じノリで照合順序で対応しようとしました。&lt;/P&gt;
&lt;P&gt;が･･･。&lt;/P&gt;
&lt;P&gt;なんか仕組みが違います。&lt;/P&gt;
&lt;P&gt;Oracleには NLS という多言語対応の仕組みが合って、照合順序に相当するものは NLS_SORT とNLS_COMP のようです。&lt;/P&gt;
&lt;P&gt;照合順序とはちょっと違うので、言語ソートとか呼んでいるみたい。&lt;/P&gt;
&lt;P&gt;基本的に環境変数で設定を行う Oracle のやり方には混乱しっぱなしですが、これらの設定は インスタンス（≒データベース）、セッション単位で設定を行うことが出来ます。&lt;/P&gt;
&lt;P&gt;テーブルやカラム単位では設定することはできないようです。&lt;/P&gt;
&lt;P&gt;（権限があれば）必要とするクエリの直前に ALTER SESSION を発行してまた元に戻せばいいので、クエリ単位でできる、といえないこともないです。&lt;/P&gt;
&lt;P&gt;COLLATE はどうやらありません。&lt;/P&gt;
&lt;P&gt;NLSSORT 関数というものはあるので、単純な比較や order by だけであれば、クエリの内部で照合順序を使うようなことは可能です。&lt;/P&gt;
&lt;P&gt;が、これは % や _ などのメタ文字との組み合わせがほぼ必須となる、like 検索では使用できないようです。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;はて、と困りました。&lt;/P&gt;
&lt;P&gt;「よーしパパ照合順序で対応しちゃうぞ～～！」と意気込んでみたら、なんか事情が違います。&lt;/P&gt;
&lt;P&gt;生クエリをゴリゴリ書いたりできるプロジェクトであれば、 ALTER SESSION と NLSSORT 関数を使いまわしてなんとかできそうなんですが、今のプロジェクトでは O/Rマッパーである Hibernate を使っており、基本的に SQL は自動生成です。&lt;/P&gt;
&lt;P&gt;特定のクエリ発行時だけ ALTER SESSION を発行するメソッドを呼び出すようにするとかなんとか考えたりもしたんですが、当時はある程度固まったDAO の使い方のルールに例外的措置を加えることになってしまうので、それもどうかという話になり。&lt;/P&gt;
&lt;P&gt;あれこれ考えた末、結果的にはログイントリガで ALTER SESSION を発行することで対応しました。&lt;/P&gt;
&lt;P&gt;NLS_SORT に JAPANESE_M_CI、NLS_COMP に LINGUISTIC を設定しています。&lt;/P&gt;
&lt;P&gt;なんか CLOB なカラムには見事に効いていないようですが･･･（Oracle Textとか使わないとなのかしらん）。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;しかしプロジェクト終盤に入った今は、このやり方は失敗だったのかなあと思っています。&lt;/P&gt;
&lt;P&gt;当然すべての文字列型の比較やソートでこの NLS_SORT と NLS_COMP の設定が有効になるわけで、辞書順ソートや比較が必要のないケースではパフォーマンス上の問題が発生します。&lt;/P&gt;
&lt;P&gt;というか、実際に発生したんですね。&lt;/P&gt;
&lt;P&gt;CHAR型だけど値の中身は全部数値になってるカラムを IN 句で1000件条件指定して UPDATE するクエリを実行したら、10分以上ダンマリって結果が･･･。&lt;/P&gt;
&lt;P&gt;2万件の UPDATE を1000件ずつ実行してるんですが、1時間たっても終わらないのでブラウザがタイムアウトとか阿保みたいな状態になってしまいました。&lt;/P&gt;
&lt;P&gt;Oracleを扱う上でとても参考させていただいている &lt;A href="http://www.shift-the-oracle.com/"&gt;Shift-The-Oracle&lt;/A&gt; さんも以下のように警告しています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;また NLS_COMP と NLS_SORT の NLS パラメータ を設定することによってオプティマイザによるアクセスパスがパフォーマンスに影響が出るくらいに大きく変化することにも注意を払う必要がある。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://www.shift-the-oracle.com/sql/national-language-compare.html"&gt;全角・半角、大文字・小文字を区別しない検索&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;文字列型カラムを大量に指定しない限りそこまで影響が出たりはしないのか、ログイントリガを設定した当初はあれこれ心配したものの特に遅くなったりもしなかったので、大丈夫かなと踏んでいたんですが。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;世のOracle使いの方々は、「大文字小文字やひらがなカタカナを区別しないLike検索」の際には、どうやっているんでしょうか？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179972.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>[Oracle]ORA-00600エラー発生</title><link>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179971.aspx</link><pubDate>Sun, 09 Aug 2009 00:21:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179971.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/179971.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2009/08/09/179971.aspx#Feedback</comments><slash:comments>858</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/179971.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/179971.aspx</trackback:ping><description>&lt;P&gt;ORA-00600。&lt;/P&gt;
&lt;P&gt;（最近更新されてないけど）Oracleの技術情報が豊富な &lt;A href="http://www.shift-the-oracle.com/"&gt;Shift-The-Oracle&lt;/A&gt; さんでは、以下の様に解説されています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;サポートに問い合わせるか、その機能や使用方法をやめる。の二択であると言っても過言ではない。&lt;/P&gt;&lt;A href="http://www.shift-the-oracle.com/oerrs/ora-00600.html"&gt;ORA-00600 - オラクル・Oracle エラー FAQ&lt;/A&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;また、 &lt;A href="http://ameblo.jp/archive-redo-blog/"&gt;Archive Redo Blog &lt;/A&gt;&amp;nbsp;さんのところでは以下のように解説されています。&lt;/P&gt;
&lt;BLOCKQUOTE&gt;
&lt;P&gt;内部エラーというのは、文字通りOracleの内部で発生したエラーで、メッセージが定義されていないものがすべてこのコードで返されるというわけです。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://ameblo.jp/archive-redo-blog/entry-10035195423.html"&gt;[Oracle] ORA-00600エラーへの対処方法&lt;/A&gt;&lt;/P&gt;&lt;/BLOCKQUOTE&gt;
&lt;P&gt;エラーコードが同じであっても全然別物だったりするってことですね。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;斯様に恐ろしいエラーなんですが、うちとこでも発生しました。こんな感じの。&lt;/P&gt;
&lt;P&gt;&lt;PRE&gt;ORA-00600: 内部エラー・コード、引数: [qernsRowP],・・・&lt;/PRE&gt;
&lt;P&gt;&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;発生した原因のひとつは直前に行ったインデックスってのはすぐ分かったんですが、さすがにインデックス張っただけでエラーが発生するとは思えないので、原因の特定を若干行いました。&lt;BR&gt;結果分かったことは以下のようなものです。&lt;BR&gt;テーブルの形はこんな感じ。&lt;/P&gt;&lt;PRE&gt;create table MEMBER (
 USER_ID number(10) not null,
 NAME varchar(50 char) not null,
 primary key( USER_ID )
)
&lt;/PRE&gt;
&lt;UL&gt;
&lt;LI&gt;言語ソート JAPANESE_M_CI を使うと発生する。&lt;BR&gt;業務上の理由から、辞書順のソートと比較が必要なため、JAPANESE_M_CI に設定しています。&lt;BR&gt;具体的にはログオントリガで NLS_SORT を JAPANESE_M_CI に、NLS_COMP を LINGUISTIC に ALTER SESSION しています。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;PK かつ FK（外部参照制約）と文字列カラムへの複合インデックスを張ると発生する。&lt;BR&gt;USER_ID と NAMEに対して張っています。&lt;BR&gt;実際には PK や FKであるかどうかは関係ないかもしれませんが、文字列カラムへの単体のインデックスを張るだけでは発生しませんでした。&lt;/LI&gt;&lt;/UL&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;UL&gt;
&lt;LI&gt;複合インデックスを張っているカラムを SELECT し、distinct をかけたインラインビューに対して rownum するクエリを発行すると発生する。&lt;BR&gt;具体的には以下のようなクエリです。&lt;/LI&gt;&lt;/UL&gt;&lt;PRE&gt;select *
from (
 select distinct USER_ID,NAME
 from MEMBER
 order by NAME
)
where rownum &amp;lt;= 10
&lt;/PRE&gt;
&lt;P&gt;distinctをつけなかったり、インラインビューになっている中のクエリだけで実行した場合には発生しませんでした。&lt;BR&gt;もしかしたら order by も影響しているかもしれません。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;これらの条件をすべて満たした環境下で発生しました。&lt;BR&gt;NLS_SORT や NLS_COMP の設定を行っているログイントリガを無効化したり、インデックスをはずしたり、エラーが発生するクエリの中身を書き換えたり、どれかひとつの条件を満たさないようにすると起きなくなります。&lt;BR&gt;また、ややこしいことに、再現性は100%ではなく、50%程度。&lt;BR&gt;業務上よく実行されるクエリなのですぐに問題発生に気づきましたが、エラーが起こらずすんなり意図した結果が出ることもあれば、エラーが発生して落ちることもあり。&lt;/P&gt;
&lt;P&gt;&lt;BR&gt;サポート直行といわれる ORA-00600 の情報はネット上でもほとんど見つからないので、原因を特定することすら困難だったりするようです。&lt;BR&gt;サポートで解決した情報は外部に公開できませんし。&lt;BR&gt;うちとこはサポート契約していないので、とりあえず要因のひとつになっているインデックスをあきらめました。&lt;BR&gt;そこまで固執する必要があるインデックスじゃなかったのでこの解決策自体はいいんですが、ちょっとインデックス張るのが怖くなりましたね･･･。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/179971.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>Oracleは全角の%や_もメタ文字として認識してしまう</title><link>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159868.aspx</link><pubDate>Fri, 24 Oct 2008 21:36:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159868.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/159868.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2008/10/24/159868.aspx#Feedback</comments><slash:comments>53</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/159868.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/159868.aspx</trackback:ping><description>&lt;P&gt;SQL Serverはどうなんだろう？　というのは調べてないんですけれども。&lt;/P&gt;
&lt;P&gt;SQLのLIKE句で使える %（0文字以上の文字列に一致） や _（1文字に一致） などのメタ文字ですが。&lt;/P&gt;
&lt;P&gt;Oracleではこれらが全角文字であってもメタ文字として動作してしまいます。&lt;/P&gt;
&lt;P&gt;マニュアル読んでもそういった記述は見当たらなかったんですが、otn とかでもそういう話題があるし、Oracle使ってる人の間では一般的な認識なのかしら？&lt;/P&gt;
&lt;P&gt;設定などで変更できるわけでもないみたいで。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;先のエントリに書いたHibernateのメタ文字エスケープの問題もあって、結局半角全角両方のエスケープが必要でした。&lt;/P&gt;
&lt;P&gt;エスケープシーケンスに設定した文字をあわせて、5文字ですね。&lt;/P&gt;
&lt;P&gt;よくまとまってるのはこのあたりでしょうか。&lt;/P&gt;
&lt;P&gt;&lt;A href="http://ameblo.jp/archive-redo-blog/entry-10033356201.html"&gt;http://ameblo.jp/archive-redo-blog/entry-10033356201.html&lt;/A&gt;&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;個人的にはこちらも、えー、なにこれ？　って仕様。&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/159868.aspx" width = "1" height = "1" /&gt;</description></item><item><dc:creator>Oakbow</dc:creator><title>コードのカラム、型はなに？</title><link>http://blogs.wankuma.com/oakbow/archive/2008/10/08/158400.aspx</link><pubDate>Wed, 08 Oct 2008 01:37:00 GMT</pubDate><guid>http://blogs.wankuma.com/oakbow/archive/2008/10/08/158400.aspx</guid><wfw:comment>http://blogs.wankuma.com/oakbow/comments/158400.aspx</wfw:comment><comments>http://blogs.wankuma.com/oakbow/archive/2008/10/08/158400.aspx#Feedback</comments><slash:comments>362</slash:comments><wfw:commentRss>http://blogs.wankuma.com/oakbow/comments/commentRss/158400.aspx</wfw:commentRss><trackback:ping>http://blogs.wankuma.com/oakbow/services/trackbacks/158400.aspx</trackback:ping><description>&lt;P&gt;仕事でOracle使ってます。&lt;/P&gt;
&lt;P&gt;SQL Serverに馴染んでいるので、機能的な違いだけでなく、取り巻く環境の違いにもよく戸惑います。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;列挙型ってありますよね。&lt;/P&gt;
&lt;P&gt;この言い回しが一般的なものなのか分かりませんけれど、例えば住所のデータベースで都道府県を記録する場合、都道府県カラムに文字列でそのまま放り込むんじゃなくて、コードを記録するってやり方。&lt;/P&gt;
&lt;P&gt;コードと実際の都道府県の文字列の対応表となるものは、アプリケーション側で保持したり。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;これ、わたしはSQL Serverではtiny intとかsmall intとか使ってました。&lt;/P&gt;
&lt;P&gt;誰かにそうするものって習ったのかどこかで見かけて真似したのかもう覚えてないんですけれど、それが普通になってました。&lt;/P&gt;
&lt;P&gt;趣味で触ったmySQLにもこれらの数値型が確かあったので、同じようにやっぱりやってました。&lt;/P&gt;
&lt;P&gt;Oracleの数値型だとnumberになっちゃうんだけど、そのままの流れでnumber(1)とかnumber(2)で設計しようとしました。&lt;/P&gt;
&lt;P&gt;すると、Oracleでの経験も多いプロジェクトメンバーに　「Oracleだと普通char型使いますよ？」と言われ。&lt;/P&gt;
&lt;P&gt;「え？そうなの？」　となんとなく納得いかない気持ちながら、そういう伝統は先人の経験から来るものだろうと素直にchar型にしました。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;コードは数値型、ってのがあまりにも当たり前になってて、そうする理由とか考えたことなかったので、char型に対するメリットを訴えられなかったのもあるんですけれど。&lt;/P&gt;
&lt;P&gt;これってどうなんだろう？と今でも思います。&lt;/P&gt;
&lt;P&gt;Oracleのノウハウを紹介しているサイトとかでも、Oracleでのコード＝char型ってな説明があったので、実際そういう伝統はあるようなのですけれど。&lt;/P&gt;
&lt;P&gt;&amp;nbsp;&lt;/P&gt;
&lt;P&gt;みなさんはコードのカラム、型は何を選んでいますか？&lt;/P&gt;
&lt;P&gt;その理由はなぜですか？&lt;/P&gt;&lt;img src ="http://blogs.wankuma.com/oakbow/aggbug/158400.aspx" width = "1" height = "1" /&gt;</description></item></channel></rss>