• ベストアンサー

char型データ 固定長のままでselect

お世話になります。 mysql5.0を使っております。 固定長char型でデータを格納しておりますが、 selectすると空白が削除されて固定長でなくなります。 固定長のままで取り出す方法を教えてください。 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
  • uturogi_k
  • ベストアンサー率37% (6/16)
回答No.1

こんにちわ Lpadを使用してみれば如何でしょうか? ご参考になれば幸いです。

参考URL:
http://sasuke.main.jp/lpad.html
javaphp
質問者

お礼

なるほど、ありがとうございました。

その他の回答 (1)

回答No.2

マニュアルを確認したところ、charの場合、検索時に後続の空白を消すことが明記されていますね。 また、varcharの場合は、後続に空白を入れた場合は、その空白は削除しないで検索されるようです。これは、標準SQLへの準拠のため、MySQL 5.0で変更したようです。 もし、後続に空白を入れた状態で格納や更新ができるなら、列のデータ型をvarcharに変えるのも一つの方法です。 charで後続の空白を含めて得るには、rpad関数で空白を補うような方法になってしまいます。 例えば、表=t1の列=c2、c3がcharだとすると、こんな感じです。 <SQL例1> select c1, rpad(c2,8,' ') as c2, rpad(c3,16,' ') as c3, c4 from t1; charの定義長を知るには、information_schemaのcolumns表を検索することで可能です。 例えば、データベース=test1のテーブル=t1の列の定義長を知りたい場合、こんな感じのSQLになります。 <SQL例2> select column_name, data_type, character_octet_length from information_schema.columns where table_schema='test1' and table_name='t1' order by ordinal_position ; rpad関数の長さ部分を自動で拾うには、<SQL例2>のSQLをサブクエリにして、<SQL例1>に入れ込む方法が考えられます。 また、単純にサブクエリで拾う場合、SQLが冗長になってしまうので、列の定義長を得るクエリをストアド・ファンクションにしてしまう方法もあります。 ストアド・ファンクションの定義例は、次のようになります。 <SQL例3> delimiter // create function CharLen (DbName varchar(30), -- データベース名 TblName varchar(30), -- テーブル名 ClmName varchar(30)) -- カラム名 returns int begin declare wClmLen int; select character_octet_length into wClmLen from information_schema.columns where table_schema=DbName and table_name=TblName and column_name=ClmName; return wClmLen; end; // delimiter ; このストアド・ファンクションを活用すれば、次のようなSQLになります。 <SQL例4> select c1, rpad(c2,CharLen('test1','t1','c2'),' ') as c2, rpad(c3,CharLen('test1','t1','c3'),' ') as c3, c4 from t1;

関連するQ&A