MySQLのvarchar型をintegerにcastしながらorderとかするとどうなるか

1. 始めに
MySQLを使っていてとある問題に当たった。文字列と数字列が混在するカラムで、数字のみの比較を取りたくなった。比較というか厳密にはmax()を取りたかった。
varchar型のカラムなのでmax()をするとそのカラムの中で9から始まる列が最も大きなカラムとして認識されてしまった。
例えば、1234 と 99 という二つの数字(カラムはvarcharなのでMySQL的には文字列)があり、そのカラムに対してmax()を取ると99がmaxとして出てきてしまった。
これは想像の通り、1234の1という文字と99の9という文字では9の方が文字として大きいとして認識されてしまったからだ。
そこでintegerにcastしたときにどんな動作になるか試してみた。

続きを読む MySQLのvarchar型をintegerにcastしながらorderとかするとどうなるか

Smartyを2系列から3系列に移行するにあたって困ったこと

1. 始めに

自分が運用しているいろいろなwebサイトでテンプレートエンジンであるSmartyを利用している。エスケープとかを全部オマカセにできてMVCが分離できるっていうのでなかなかの優れものだ。

で、最近、ひょんなことからwebサーバを構築し直すことになった。従来のサーバではSmartyのバージョンが2系列を利用したのだけれど、どうやら3系列が最新版らしかったのでこっちを入れてみた。

動作が高速になるだとかいろいろと恩恵があるそうで、それならば、ということで。何より最新版があるならばそっちを利用しよう、というのがモットーなので今回も多分に漏れず移行してしまったみました。

Smarty2.0からSmarty3.0への変更点 | suinasia

2. 問題その1

さて、インストールなどは簡単に終わり早速移行したのだけれどいきなり問題が発生した。

smartyでappendしている変数がどうにも表示されない。{debug}を埋め込んでみても変数が渡されている形跡が無い。不審に思ってappend(assign)している箇所にて渡される変数を見てみるとこちらはちゃんと内容が入っている。うーん、これは困ったなぁ、と思いながら眺めているとすべての変数が渡されていないわけじゃないことに気がついた。一部変数はちゃんと渡されているのだ。ということはappend(assign)が絶対的に悪いわけじゃ無いらしい。

で、どんな値なら渡されてどんな値は渡されていないのか、そこが気になった。で、一目瞭然、日本語データが渡されていないのだ。

mb_convert_stringなどでテキトウに変換して渡してやると変な状態になった。出力がUTF-8の時のみ、データが表示されたのだ。

今回対象となっているwebサイトは作られた時期が古く、SJISでやりくりしていた。smartyの出力もSJISだったんだ。というわけでどうやらそこが原因らしい。

で、smarty3とutf-8あたりでググるとさっそく情報が出てきた。というか前述のページにもしっかり書かれてました。

SMARTY_RESOURCE_CHAR_SETという変数がUTF-8で宣言されるのですが、コレをsmartyより先にSJISとかでdefineしないとダメぽです。

UTF-8 以外でテンプレートを作成する – smarty3

define('SMARTY_RESOURCE_CHAR_SET', 'SJIS');
require_once('Smarty.class.php');