Symfoware

Symfowareについての考察blog

PostgresqlのCollateとCtype指定によるORDER BYの差異

Arch LinuxにPostgresqlをインストールして、外部から接続して見ました。

Arch LinuxにPostgresqlをインストールする


ここでデータベースを作成するとき、明示的にcollateとctypeに「C」を指定しました。


[postgres@(none) ~]$ createdb -E UTF8 -T template0 --lc-collate=C --lc-ctype=C test




ふと、「C」ではなく「ja_JP.UTF-8」を指定したら何か違いが出るのか疑問に思ったので試して見ました。




Collateを変更したデータベース作成



Collate・CType共に「ja_JP.UTF-8」を指定したデータベース「testu」を作成します。


[postgres@(none) ~]$ createdb -E UTF8 -T template0 --lc-collate=ja_JP.UTF-8 --lc-ctype=ja_JP.UTF-8 testu





test、testu各々にこんなテーブルを作成。

create table sample(
id int,
val nchar(100)
);





Javaでサンプルプログラムを作成し、testとtestuを使用した時の結果に差があるか見て見ました。


  1. package com.fc2.blog68.symfoware.pg;
  2. import java.sql.Connection;
  3. import java.sql.DriverManager;
  4. import java.sql.ResultSet;
  5. import java.sql.Statement;
  6. public class Sample {
  7.     public static void main(String[] args) {
  8.         try {
  9.             String url = "jdbc:postgresql://192.168.1.12:5432/test";
  10.             String user = "pguser";
  11.             String pass = "password";
  12.             Connection con = DriverManager.getConnection(url, user, pass);
  13.             
  14.             Statement stmt = con.createStatement();
  15.             
  16.             stmt.execute("delete from sample");
  17.             
  18.             stmt.execute("insert into sample (id, val) values (1, 'あ')");
  19.             stmt.execute("insert into sample (id, val) values (2, 'い')");
  20.             stmt.execute("insert into sample (id, val) values (3, 'う')");
  21.             stmt.execute("insert into sample (id, val) values (4, 'え')");
  22.             stmt.execute("insert into sample (id, val) values (5, 'お')");
  23.             
  24.             stmt.execute("insert into sample (id, val) values (6, 'A')");
  25.             stmt.execute("insert into sample (id, val) values (7, 'B')");
  26.             stmt.execute("insert into sample (id, val) values (8, 'C')");
  27.             stmt.execute("insert into sample (id, val) values (9, 'D')");
  28.             stmt.execute("insert into sample (id, val) values (10, 'E')");
  29.             
  30.             stmt.execute("insert into sample (id, val) values (11, 'a')");
  31.             stmt.execute("insert into sample (id, val) values (12, 'b')");
  32.             stmt.execute("insert into sample (id, val) values (13, 'c')");
  33.             stmt.execute("insert into sample (id, val) values (14, 'd')");
  34.             stmt.execute("insert into sample (id, val) values (15, 'e')");
  35.             
  36.             stmt.execute("insert into sample (id, val) values (16, '亜')");
  37.             stmt.execute("insert into sample (id, val) values (17, '位')");
  38.             stmt.execute("insert into sample (id, val) values (18, '卯')");
  39.             stmt.execute("insert into sample (id, val) values (19, '絵')");
  40.             stmt.execute("insert into sample (id, val) values (20, '尾')");
  41.             
  42.             stmt.execute("insert into sample (id, val) values (21, 'ア')");
  43.             stmt.execute("insert into sample (id, val) values (22, 'イ')");
  44.             stmt.execute("insert into sample (id, val) values (23, 'ウ')");
  45.             stmt.execute("insert into sample (id, val) values (24, 'エ')");
  46.             stmt.execute("insert into sample (id, val) values (25, 'オ')");
  47.             
  48.             stmt.execute("insert into sample (id, val) values (26, 'ア')");
  49.             stmt.execute("insert into sample (id, val) values (27, 'イ')");
  50.             stmt.execute("insert into sample (id, val) values (28, 'ウ')");
  51.             stmt.execute("insert into sample (id, val) values (29, 'エ')");
  52.             stmt.execute("insert into sample (id, val) values (30, 'オ')");
  53.             
  54.             stmt.execute("insert into sample (id, val) values (31, 'ああ')");
  55.             stmt.execute("insert into sample (id, val) values (32, 'あい')");
  56.             stmt.execute("insert into sample (id, val) values (33, 'あう')");
  57.             stmt.execute("insert into sample (id, val) values (34, 'あえ')");
  58.             stmt.execute("insert into sample (id, val) values (35, 'あお')");
  59.             
  60.             ResultSet rs = stmt.executeQuery("select * from sample order by val");
  61.             System.out.println("-----------order by val------------");
  62.             while(rs.next()) {
  63.                 System.out.println(rs.getString("val").trim());
  64.             }
  65.             
  66.             rs = stmt.executeQuery("select * from sample where val like '%あ%'");
  67.             System.out.println("-----------like '%あ%'-------------");
  68.             while(rs.next()) {
  69.                 System.out.println(rs.getString("val").trim());
  70.             }
  71.             
  72.             stmt.close();
  73.             con.close();
  74.         } catch (Exception e) {
  75.             e.printStackTrace();
  76.         }
  77.     }
  78. }







実行結果



左が「C」指定、右が「ja_JP.UTF-8」指定です。

test(C)testu(ja_JP.UTF-8)
-----------order by val-----------------------order by val------------
A
B
C
D
E
a
b
c
d
e

ああ
あい
あう
あえ
あお



















A
B
C
D
E
a
b
c
d
e






ああ
あい
あう
あえ
あお














-----------like '%あ%'------------------------like '%あ%'-------------

ああ
あい
あう
あえ
あお

ああ
あい
あう
あえ
あお


氏名でソートするときは氏名のふりがな列でソートすることが多いと思うので
あまり気にする必要はないのかもしれませんが、半角カナや漢字もそれなりに
ソートしたい時には、ちゃんとテストする必要がありそうです。


関連記事

テーマ:データベース - ジャンル:コンピュータ

  1. 2012/05/06(日) 18:14:31|
  2. PostgreSQL
  3. | トラックバック:0
  4. | コメント:0
  5. | 編集
<<Postgresql 9.1でCOPYを使用し、csvファイルからデータをインポートする | ホーム | Arch LinuxにPostgresqlをインストールする>>

コメント

コメントの投稿


管理者にだけ表示を許可する

トラックバック

トラックバック URL
https://symfoware.blog.fc2.com/tb.php/940-a5c9db26
この記事にトラックバックする(FC2ブログユーザー)