dポイントプレゼントキャンペーン実施中!

お世話になります。

mysql5.0を使っております。


固定長char型でデータを格納しておりますが、

selectすると空白が削除されて固定長でなくなります。

固定長のままで取り出す方法を教えてください。

宜しくお願いします。

A 回答 (2件)

こんにちわ


Lpadを使用してみれば如何でしょうか?



ご参考になれば幸いです。

参考URL:http://sasuke.main.jp/lpad.html
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/02/26 22:40

マニュアルを確認したところ、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;
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す