可搬性
可搬性 – データベースの可搬性に関する機能
Description
それぞれのデータベース管理システム (DBMS) には固有のクセがあります。
例えば、出力時にフィールド名を大文字に変換するものもあれば、
逆に小文字に変換するものもあります。
また変換せずにそのまま出力するものもあります。これらの違いのせいで、
作成したスクリプトを他のサーバで実行することが難しくなっています。
PEAR MDB2 はこれらの違いを乗りこえることに力を入れているので、
あなたが作成したプログラムは何の変更もなしで他の DBMS
に移行できることでしょう。
可搬性に関するモードのうち、どれを有効にするかについては
設定オプション portability で制御します。オプションは
factory() および
setOption() で設定します。
可搬性に関するモードはビット単位で指定するので、組み合わせる場合には
|、取り除く場合には ^ を使用します。
実際の方法については、以下の例を参照ください。
注意: MDB2 の可搬性モードは、返り値にのみ影響を及ぼします。
クエリ自体にはかかわりません。たとえば、識別子を含む名前のテーブルを作成した場合は、
すべてのクエリで quoteIdentifier() を使用する必要があります。
そうしないと "not found" や "not exists" といったエラーが発生します。
また、quote_identifier
オプションも確認しましょう。
これが false の場合は、check_option を使用してもクォートは適用されません。
可搬性に関するモードの定数
-
MDB2_PORTABILITY_ALL (デフォルト)
すべての可搬性機能を有効にします。デフォルト設定です。
-
MDB2_PORTABILITY_DELETE_COUNT
削除された行数を強制的に取得します。
単純な DELETE FROM tablename
クエリを実行した場合に、削除された行数を返さない DBMS があります。
このモードは、そんな DBMS から削除された行数を取得するために、
DELETE クエリの最後に
WHERE 1=1 を追加します。
-
MDB2_PORTABILITY_EMPTY_TO_NULL
入出力データの空文字列を null に変換します。
Oracle は空の文字列を null と判断するため、これが必要になります。
一方、他の大半の DBMS は空の文字列と null を区別します。
-
MDB2_PORTABILITY_ERRORS
特定のドライバのエラーメッセージを、他の DBMS と互換性のあるものに変換します。
エラーコードの対応表
ドライバ |
説明 |
変更前の定数 |
変更後の定数 |
mysql, mysqli
|
ユニークキーおよび主キー制約
|
MDB2_ERROR_ALREADY_EXISTS
|
MDB2_ERROR_CONSTRAINT
|
mysql, mysqli
|
NOT NULL 制約
|
MDB2_ERROR_CONSTRAINT
|
MDB2_ERROR_CONSTRAINT_NOT_NULL
|
-
MDB2_PORTABILITY_FIX_ASSOC_FIELD_NAMES
これは、連想配列のキーからすべての修飾子を取り除きます。
例えば SQLite のデフォルト設定では、修飾子つきのクエリで結果を取得すると
カラム名の修飾子が付加されます。
-
MDB2_PORTABILITY_FIX_CASE
すべてのメソッドにおいて、テーブルやフィールドの名前を
小文字あるいは大文字に変換します。どちらに変換するのかは、
オプション field_case
の設定に依存します。このオプションは
CASE_LOWER (デフォルト) あるいは
CASE_UPPER を指定します。
注意: この変換は、返り値に対してのみ適用されます。
クエリ内のフィールド名やテーブル名には適用されません。
-
MDB2_PORTABILITY_NONE
すべての可搬性に関する機能を無効にします。
-
MDB2_PORTABILITY_NUMROWS
numRows() を Oracle
で動作させるハックを有効にします。
-
MDB2_PORTABILITY_RTRIM
取得したデータの右側にある空白をすべて取り除きます。
これは、固定長文字列の右側を自動的にトリムするような RDBMS
には適用されません。たとえ可変長文字列で右側がトリムされていなくても同じです。
Example
<?php
require_once 'MDB2.php';
$dsn = 'mysql://user:password@host/database'
$options = array(
'debug' => 2,
'portability' => MDB2_PORTABILITY_NONE,
);
$mdb2 =& MDB2::connect($dsn, $options);
if (PEAR::isError($mdb2)) {
die($mdb2->getMessage());
}
?>
setOption() を使用して、
小文字変換と空白除去の機能を有効にする
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$mdb2->setOption('field_case', CASE_LOWER);
$mdb2->setOption('portability',
MDB2_PORTABILITY_FIX_CASE | MDB2_PORTABILITY_RTRIM);
?>
setOption() を使用して、
空白除去以外のすべての可搬性機能を有効にする
<?php
// すでに $mdb2 という名前の MDB2 オブジェクトが存在するものとします
$mdb2->setOption('portability',
MDB2_PORTABILITY_ALL ^ MDB2_PORTABILITY_RTRIM);
?>