【Oracle to PostgreSQL】SQLは同じでも結果が違う!? CHAR型の空白編

こんにちは。
SCSKの丸山です。

SQLは同じでも結果が変わってしまう「仕様の壁」。今回は、CHAR型についてお伝えします。

前回の記事はこちらです。

ケース2 CHAR型の空白

Oracle DBとPostgreSQLには、それぞれCHAR型のデータ型があります。使用方法は変わりませんが、CHAR型のLENGTHの表示のされ方が異なります。今回は、以下のようなテーブルを作成した際に、Oracle DBとPostgreSQLでどのような違いがあるのか確認します。

まず、前提としてそれぞれのDBに以下のCHAR型、VARCHAR型のカラムのあるテーブルを用意します。

テーブル作成時のSQL:

CREATE TABLE TEST(CHAR_COL CHAR(10), VARCHAR_COL VARCHAR(10));
INSERT INTO TEST(CHAR_COL, VARCHAR_COL) VALUES(‘123′,’123’);

テーブル名:TEST

CHAR_COL VARCHAR_COL
123 123

そのうえで、LENGTH(文字数カウント)がOracle DBとPostgreSQLでどのように違うのか見ていきましょう。

Oracle DBの場合

SQL> SELECT CHAR_COL, LENGTH(CHAR_COL), VARCHAR_COL, LENGTH(VARCHAR_COL) FROM TEST;
CHAR_COL LENGTH(CHAR_COL) VARCHAR_COL LENGTH(VARCHAR_COL)
123 10 123 3

Oracle DBの場合、CHAR型では宣言した10文字までが空白で埋められた前提としてLENGTHの結果が表示されます。

PostgreSQLの場合

SELECT CHAR_COL, LENGTH(CHAR_COL), VARCHAR_COL, LENGTH(VARCHAR_COL) FROM TEST;
CHAR_COL LENGTH(CHAR_COL) VARCHAR_COL LENGTH(VARCHAR_COL)
123 3 123 3

PostgreSQLでは、CHAR型、VARCHAR型共に入力した文字数の3がカウントされます。

今回のケース、挿入した文字列を表示したい場合となると、PostgreSQLの方が使いやすいかもしれませんね。Oracle DBでCHAR型のカラムに対するLENGTHを使用している場合、このような違いを理解した上で方針を考えてみてください。

今回はここまで。次回もお楽しみに!

 

タイトルとURLをコピーしました