RDS記事タイトルとURLをコピーするだいぶ久しぶりの技術ブログになります。CSチームのhiroです。某有名女優と結婚された方は大文字ですが、当方は小文字ですのでお間違いなきようお願いします。Supportとほとんどの方が答えられると思います。Satisfactionの略で、お客様に満足していただけるようサービスを運用するのがチームスピリットになっています。SatisfactionSupportかなと思っています。略してCS2!なんだかAWSの1サービスっぽくてCool!です)前置きはこれぐらいにして、現在、PostgreSQL&Symfony1.0系で運用されているオンプレミスの環境をAWS上に移行するプロジェクトに参加しています。RDS)へコンバートしアプリ側の対応を行う作業を担当しています。私自身MySQLは初という事で移行作業で遭遇した数々の問題を愚痴...、もとい共有したいと思います。■ユーザについてPostgreSQLではユーザ名は一意です。'パスワード';DB接続の許可/不許可をアクセス元毎に設定する場合は別途pg_hba.confに下記のように記述します。md5MySQLではアクセス元毎にユーザを作成します。'パスワード';同じユーザ名でもアクセス元分上記操作が必要です。@以降を取り除く事でアクセス元を特定しない事も可能です。権限の指定も同様で、下記で同時にユーザも追加されます。'パスワード';他にも色々と管理方法での違いがありますが、一番最初に戸惑ったのがこの部分でした。管理周りは他に詳しく書かれている記事があると思いますので軽く紹介するだけにとどめておきます。■文字コードについてPostgreSQLではデータベース単位で作成時に文字コードを指定します。'UTF8';MySQLでは最小単位はカラムで、テーブル単位でも指定できます。デフォルト値はデータベースに設定します。UTF8;個別に指定する事はあまりないと思いますので、設定ファイルmy.cnfにデフォルト値を記述するのが安全です。[mysql]default-character-set=utf8[mysqld]character-set-server=utf8skip-character-set-client-handshake■ストレージエンジンについてPostgreSQLでは早い時期からトランザクションに対応していました。そのため、PostgreSQLをその頃から使っている方が多いかと思います。MySQLはストレージエンジンを変える事によってトランザクション対応を変える事ができます。テーブルを作成するときにトランザクション対応する場合はストレージエンジンにInnoDBを、しない場合はMyISAMを指定します。ENGINE=MyISAM;MySQL5.5からはデフォルトでInnoDBストレージエンジンのテーブルが作成されます■テーブル名で大文字小文字についてPostgreSQLではテーブル名で大文字小文字を区別しませんがファイル名で区別する環境のMySQLのデフォルトは区別するようになっています。区別する事はあまりないので、基本的に小文字で統一しますが人間の手でやっていると統一性がとれないため設定ファイルで対応するようにします。・できるだけ、予約語は大文字を、それ以外は小文字を使用する!■カラム名での大文字小文字についてどちらもカラム名は大文字小文字を区別しませんがMySQLではSELECT結果のカラム名が指定したまま返ってきます。|+---------+----------------+PostgreSQLでは小文字で返ってきて、関数の引数までは返ってきません。PHPでレコードを連想配列で取得するとカラム名がそのまま連想配列のキーに使用されるため問題が発生します。PHPのフレームワークにSymfony1.0.6を使っていたのですが、フレームワークが生成するSQLのカラム名が大文字になっていたため、今まで動いていたものが動かなくなってしまいました!Symfony1.0系の最新にアップデートしてdatabases.ymlに下記を設定して対応しました。・連想配列のキーに直値を使わない!(定数等を使うようにする)■TIMESTAMPの精度についてTIMESTAMPの精度はPostgreSQLはマイクロ秒で、MySQL5.5は秒となっています。秒未満の精度を期待していると互換性がとれなくなります。秒未満での精度に左右される仕様はかなり危険です。TIMESTAMPでマイクロ秒まで扱いができるようになっています。TIMESTAMP型の列だけでソートしてはいけません!※今回の件では追加順にソートする必要がありました。レコードを削除しないためソートにID列を含めれば実際には追加した順にソートされますが、本来ID列は識別子としてのみ使用するべきです。必要に応じてソート用の列を追加することも検討しましょう。'swx';PostgreSQLではレコードが引っかからず、MySQLでは引っかかってしまいます。大文字小文字を区別する場合はテーブル作成時にカラムにBINARY指定を入れます。00:00:00※PostgreSQLではINTERVALの精度はマイクロ秒になっています。MySQLでは単数系のみとなっています(シングルクォートもいりません)。BIGSERIAL型を使いますが、MySQLでは整数型にAUTO_INCREMENTを指定します。AUTO_INCREMENTの指定を複数入れる事は出来ません。PostgreSQLではトランザクション内で最後に採番された値をとるときには下記のように行います。currval('シーケンス名');MySQLでは最後にインサートしたレコードのAUTO_INCREMENT列の値を下記で取得できます。last_insert_id();この値をSQL内でそのまま使いたい場合は変数にセットして使用する必要があります。01MySQLでは困った事に"||"は論理和演算子になります。|+------------+シンタックスエラーにならないので、陥りやすい罠です。ここはCONCAT関数に置き換える必要があります。style="font-size:24px;"><strong>まとめ</strong></span>今回は気になったものを中心にまとめてみましたが、まだまだ差異が存在します。データベースそれぞれで同じ機能でも名前が違ったり少し動作が違ったりします。アプリ開発時になるべくSQL標準にそった形にしようとしても、独自機能を使わざるを得ない場合がどうしてもあります。特定のデータベースに依存しない作りにするのは現実的に難しいと改めて実感しました。RDSにPostgreSQLがあればどんなに良いか改めて思い知らされました。2009-引用をストックしましたストック一覧を見る閉じる引用するにはまずログインしてくださいログイン閉じる引用をストックできませんでした。再度お試しください閉じる限定公開記事のため引用できません。