[MySQL] OR検索をFIND_IN_SET()関数を使って記述する

以前のエントリでFIND_IN_SET()関数の用法を紹介したけど。今回はその派生的なトピックス。ちょっと変わったFIND_IN_SET()の使い方かも。たとえば

は、FIND_IN_SET()を使うと以下のように書ける。

参考サイト

MySQL :: find_in_set() 関数 [Tipsというかメモ]
http://tm.root-n.com/database:mysql:etc:find_in_set

FIND_IN_SET()の用法に関しては以下マニュアルページを参照。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.2 文字列関数
http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html

[MySQL] テキストにはVARCHAR型と?TEXT型のどちらを使うべきか?

MySQLのテキスト型にはVARCHARと?TEXT(TINYTEXT、TEXT、MEDIUMTEXT、LONGTEXT)がある。長さの制限が違うだけで、どれを使ってもテキストを格納できるが、それぞれ特性は違うのだろう。プログラミングを実践する上でどのテキスト型を使うのが適切なのか判断できるように、これらの違いについてきちんと理解しておきたい。

ざっくりググってみると、テキスト型の違いを論じているページがいろいろ見つかる。

Takahiko HORIUCHI – Google+ – RDBMS に MySQL を採用したシステムで、VARCHAR の代わりに TEXT…
https://plus.google.com/113405959631093302363/posts/E4tDXucskqb

VARCHAR と ?TEXT の違い – ngの日記
http://ngyuki.hatenablog.com/entry/20110804/p1

MySQLのテキスト型 | Koumei Soft 開発ログ
http://blog.ks2.info/?p=462

mysqlのvarchar型 – Yahoo!知恵袋
http://detail.chiebukuro.yahoo.co.jp/qa/question_detail/q1256083387

MySQLのVARCHARサイズについて – Togetter
http://togetter.com/li/54358

一番上のページからリンクされていた英語ページの説明が的を得ている。

TEXT vs. VARCHAR
http://www.pythian.com/blog/text-vs-varchar/

MySQL: TEXT vs. VARCHAR Performance | NicJ.net
http://nicj.net/mysql-text-vs-varchar-performance/

これらのページを読んでわかったことは、MyISAMストレージエンジンに限って言えば「VARCHAR型はDBストレージ内にデータそのものが格納されるが、TEXT型だとデータは外部に格納されてDBストレージにはそのポインタが格納される」ということ(InnoDBは違うらしい)。これより、データのアクセス速度は、ポインタを追ってデータの実体にたどり着かなければならないTEXT型よりも、DBストレージに直接データが格納されているVARCHAR型のほうが高速であることは容易に推測できる。さらに、TEXT型のサイズに神経質になる必要が無い反面、VARCHAR型のサイズはデータベースのストレージサイズの制限に影響されるので、大きいサイズのデータをVARCHAR型で格納することはコスト高になることも想像に容易い。

さらに、2番目の英語ページでは以下の結論で結んでいる。

  • ストレージの使い方に由来して、TINYTEXTを使うよりもVARCHARを使ったほうが望ましい。
  • NULL以外のDEFAULT値をセットしたい場合には、VARCHAR(あるいはCHAR)を使うしかない。
  • ざっと64KBよりも長い文字列を格納する必要がある場合は、MEDIUMTEXTやLONGTEXTを使う。VARCHARは64KBより長い文字列を格納できないから。
  • マルチバイト文字列を格納する場合には更に注意が必要。VARCHAR(255)は255文字を格納できるが、マルチバイト文字列を使う場合にはデータサイズが255バイトよりも大きくなることに注意。

小規模なシステムでは大した問題にはならないが、マスなデータを取り扱うシステムではVARCHAR型と?TEXT型の選び方が大事だろう。自分がどうしてVARCHAR型あるいは?TEXT型を選んだのか、きちんとした理由が説明できるようにしておきたい。

[MySQL] データベースを使ってApacheのBasic認証を行うには (mod_auth_mysql)

会員制サイトを簡単に運営するにはApacheのBasic認証が便利。パスワードを平文で記述した.htaccessファイルをウェブから見えないパスに置いておけばとりあえず事は足りる。しかし会員数が増えてくると.htaccessをいちいちスキャンする必要があるのに加えて、たった1個の平文のテキストファイルに認証を委ねるのはリスクあり。すなわち、パフォーマンスと安全性を考えると.htaccessには限界がある。

mod_auth_mysqlモジュールを使う

ApacheにはMySQLに登録されている会員情報を使ってBasic認証を行う仕組みが用意されている。具体的にはmod_auth_mysqlモジュールを追加して行う。今回そういうセットアップの必要があったので、覚え書きとして本家サイトと参考にさせてもらったサイトのリンクを記しておく。

mod_auth_mysql
http://modauthmysql.sourceforge.net/

Apacheの基本認証をDBを使って行うmod_auth_mysql – プログラマになりたい
http://d.hatena.ne.jp/dkfj/20101030/1288443379

mod_auth_mysqlを利用してBasic認証にMySQLのデータを利用する – blog.katsuma.tv
http://blog.katsuma.tv/2007/10/mod_auth_mysql_basic_auth.html

[MySQL] 計算式を指定するには

MySQLのテーブルを複数フィールドの値を使った計算結果で抽出したりソートしたい。例えば、ブログの記事に対して読者が星1つから5つの間で評価を行い、データベースの記事レコードには星の数と評価数が積算されているような状況で、平均の星数の大きい順にソートして記事を表示するにはどうするか、みたいな話。

SQL中で算術演算子を使う

SQL中では算術演算子が使えるので、以下のように書ける。

演算子についていろいろ知っておくと役立ちそう。

参考サイト

MySQL :: MySQL 5.1 リファレンスマニュアル :: 11.4.1 算術演算子
http://dev.mysql.com/doc/refman/5.1/ja/arithmetic-functions.html

nakamura-tech : MySQL入門 – SELECT(2) ソート
http://blog.livedoor.jp/nakamura_tech/archives/51297132.html

[MySQL] カンマ区切りの部分文字列を検索するには

MySQLのテーブルにカンマ区切りの部分文字列を格納しているフィールドがあり、そのフィールドに特定文字列を含むレコードだけを抽出したい。例えば、このブログのエントリがレコードだとすると、レコードごとに複数のタグを付けることができて、特定のタグが付いているレコードのみを抽出するような場合とか。

  • 記事1、”タグ1,タグ2,タグ3″
  • 記事2、”タグ2”
  • 記事3、”タグ2,タグ3″

カンマ区切りの部分文字列のチェックには FIND_IN_SET を使う

単純に LIKE でタグ文字列との合致をチェックしても可能だけど、MySQLには、まさに部分文字列との合致をチェックするための関数 FIND_IN_SET がある。せっかくあるなら使うに限る。

MySQL :: MySQL 4.1 リファレンスマニュアル :: 6.3.2 文字列関数
http://dev.mysql.com/doc/refman/4.1/ja/string-functions.html

ソースは以下のサイト。

MySQLでカンマ区切りデータの中から検索する便利なFIND_IN_SET関数 | ハチログ
http://www.hachi-log.com/mysql-find-in-set/

[PHP] PHPUnitをXAMPPにセットアップする

PHPUnitはPHP版のxUnit、すなわちユニットテスト自動化のためのフレームワーク。

さほどPHP暦が長くない自分はこれまでテストを書いてこなかったのだけど、現在携わっているプロジェクトの複雑さが増すにつれてテストの必要性を感じるようになった。そこで、ローカルのXAMPP環境にPHPUnitをインストールして、テストの書き方や実施方法などを学習してみようと思う。

以下インストールの覚書。

公式サイト

PHPUnit – The PHP Testing Framework
http://phpunit.de/

PHPUnit マニュアル
https://phpunit.de/manual/current/ja/index.html

インストール

PHPUnit マニュアル – 第1章 PHPUnit のインストール
https://phpunit.de/manual/current/ja/installation.html#installation.optional-packages

1. PHP バイナリ用のディレクトリを作ります(例:C:\bin)

2. ;C:\bin を、環境変数 PATH に追記します (参考資料)。

3. https://phar.phpunit.de/phpunit.phar をダウンロードして、 C:\bin\phpunit.phar に保存します。

4. コマンドプロンプトを開きます ( Windows+R » cmd » ENTER)。

5. 以下のようにして、バッチスクリプト (C:\bin\phpunit.cmd) を作ります。

(僕の環境はphpのパスが通っていなかったのでphpをフルパスで指定するように変更)

6. コマンドプロンプトをもう一枚開き、どこからでも PHPUnit を実行できることを確認します。

試しにテスト

PHPUnit マニュアル – 第2章 PHPUnit 用のテストの書き方
https://phpunit.de/manual/current/ja/writing-tests-for-phpunit.html

テストコード StackTest.php

実行する。

参考サイト

PHP開発者のためのテストのすゝめ(1):ユニットテストはなぜ必要なの? (1/2) – @IT
http://www.atmarkit.co.jp/ait/articles/0909/14/news103.html

PHP開発者のためのテストのすゝめ(2):PHPUnitでユニットテスト (1/3) – @IT
http://www.atmarkit.co.jp/ait/articles/0911/12/news105.html

PHPUnit3で始めるユニットテスト:特集|gihyo.jp … 技術評論社
http://gihyo.jp/dev/feature/01/php-test

[PHP] 関数に引数を参照渡しする

PHPでも関数の引数を参照渡しできる。

参照渡しするには変数に&を付ければ良い。

参考サイト

PHP: 関数の引数 – Manual
http://php.net/manual/ja/functions.arguments.php

PHP: リファレンス渡し – Manual
http://php.net/manual/ja/language.references.pass.php

[PHP] 誕生日から満年齢を得る

ユーザの満年齢をチェックしたいときがある。

たとえば18禁のエロサイトとか、成人していることが条件の通販サイトとか。ユーザに誕生日を入力させて、現時点の満年齢をチェックしたい。

今日と誕生日の2つのDateTimeオブジェクトを作成して、その差を年単位で取得すれば満年齢が得られる。

参考サイト

PHP: DateTime – Manual
http://php.net/manual/ja/class.datetime.php

[PHP] 存在する日付かチェックする

ユーザに入力させた日付が実際に存在するかチェックしたいときがある。

たとえば30日しかない月なのに31日と入力されたり、うるう年でないのに2月29日と入力されたり。そういった不適切な入力を検知して、ユーザに再入力を促したい。そのためには入力された日付の妥当性を確認する必要がある。

日付の妥当性チェックはcheckdate関数で行える。

参考サイト

PHP: checkdate – Manual
http://php.net/manual/ja/function.checkdate.php

[PHP] 関数から複数の戻り値を返す

便利なPHPの言語仕様にの1つにlist構文がある。

list構文を使うことで、関すから複数の値を返すことができる。

参考サイト

PHP: list – Manual
http://php.net/manual/ja/function.list.php

PHP: 返り値 – Manual
http://php.net/manual/ja/functions.returning-values.php