中学受験専門 理科総合研究所 −理総研−

フロントページへ
Name:
Pass:
RSS
: ユーザー登録はコチラ :
左 理総研:技術情報と開発メモ 右

011:数値のゼロフィル/ゼロ埋め

対象言語:JavaScript|PHP / MySQL
キーワード:PHP 5.0 JavaScript MySQL sprintf % d 数値 Int 文字列 String ゼロフィル ゼロ埋め LAST_INSERT_ID() INSERT
日付を扱うときの1月→01月と表示したいとか、ID管理に4567→004567にしたいとか、とにかく数値を任意の桁数で指定してゼロフィル(ゼロ埋め・ゼロパディング等)するには、JavaScriptならsliceメソッド,PHPならsprintf関数を使用します。入力は数値でも出力されるデータは文字列であることに注意しないと、MySQLなどのデータベースからデータを得るとき、特に「フィールドタイプ=数値型」で「表示=(UNSIGNED)ZEROFILL」と指定しているときによからぬエラーを生みます。
  • JavaScriptの場合は、以下のように数値の頭に文字列として0を付け足し(出力したい桁数−1)、そうやってできた文字列のお尻から出力したい桁数だけを切り取る。

var num = 1;
var str2 = ("0" + num).slice(-2);
var str4 = ("000" + num).slice(-4);
//出力
// num	> 1
// str2	> "01"
// str4	> "0001"
  • PHPの場合は、


$num = 123;

echo $num . ":型は" . gettype($num);		// 出力>123:型はinteger

// 6ケタのゼロフィル
$num = sprintf("%06d", $num);
echo $num . ":型は" . gettype($num);		// 出力>000123:型はstring

// キャスティングによる文字列型→数値型変換
$num = (int) $num;
echo $num . ":型は" . gettype($num);		// 出力>123:型はinteger


  • さてこれがどうしてデータベースに絡んでくるのかというと、次のテーブルパターンを想定してみます。
    フィールドid・・・friends
    タイプ
    表示
    追加
    INT(6)
    UNSIGNED ZEROFILL
    auto_increment
    TEXT
    000123
    000124000123,000125,
    000125000123,
    idカラムのデータは、INSERTが実行されれば自動的に加算して割り振られるユニークな数値です。データベース上ではゼロフィルが施されていますが、当然ながらデータベース内で文字列として扱われているわけではありません。 次のようにINSERTを実行して新しいidをLAST_INSERT_ID()で取得すると、$last_idの値は数値型の「126」であって「000126」ではありません。

$result_lock = mysql_query("LOCK TABLES `user` WRITE", $link) or die("テーブルロックの失敗:". mysql_error());

	$sql = "INSERT INTO `user` SET `id` = ''";
	$result = mysql_query($sql, $link) or die('追加できないよ:' . mysql_error());

	$sql = "SELECT LAST_INSERT_ID() FROM `user`";
	$result = mysql_query($sql, $link) or die('データ取得できねぇ:' . mysql_error());
	$rec = mysql_fetch_array($result);

	$last_id = $rec['0'];

$result_lock = mysql_query("UNLOCK TABLES", $link) or die("テーブルロック解除の失敗:". mysql_error());


echo $last_id;		// 出力>126


  • friendsカラムは、友人のidをCSV形式で管理するためにフィールドタイプにTEXT(つまり文字列)を指定しています。$last_idの値(数値型)をそのまま活用すると、friendsカラム内の各々のidが、操作によってはユニークなもので無くなってくる可能性があります。
    どういうことかと言いますと、friendsカラムのデータをゼロフィルされていないidでCSV形式をとるなら、「2155,2126,126,123,125,」とかになります。「008:MySQLのカラムデータから文字列を削除してUPDATE」のようにid:000126をfriendsカラムから削除したいとき、LIKEを使って「126,」を削除しようとすれば、下線部のように道連れが出来てしまいます。すると実行結果が「2155,2123,125,」となってしまい、謎の新しいid:2123が発生します。
    つまりデータベース上でゼロフィルされたユニークな数値を管理する場合、常にsprintf関数で数値をゼロフィルした文字列に変換して利用する必要があるのです。

$last_id = sprintf('%06d', $rec['0']);		// 出力>000126

著者 You Mizuguchi
© 2011 System-iDO IT Devisers