Nacky - Snowland.net

Nacky(Issei Ishii)がDJ/Composerのようなふりして書き散らすblogサイト

Info

«Prev || 1 | 2 | 3 || Next»

2010-05-18

SQLで大文字/小文字/全角/半角/ひらがな/カタカナを検索

文字列一致を見たいのだが,文字列には全角/半角,大文字/小文字,ひらがな/カタカナが含まれている.
これを一括で条件指定したい.
というときの解決法.
(PHP+ PostgreSQL/MySQLを想定)

■1.検索用に別カラムを持っておく
DBにあらかじめ mb_convert_encoding($str,'AcKV') 等で簡易に正規化(?)した文字列を持つためのカラムを作成する.
検索時は変換したカラムに対して指定する.

まぁ,これが楽か.
ただしINSERTもUPDATEも二度手間です.
そういうものだとして実装すれば良いわけですが.

■2.検索時にがんばる
2-1.translateする
translate(upper(str_column),'abc...','abc...') LIKE '%str%'
ただしPostgreSQLにはtranslateがありますがMySQLには無いようです.
アルファベット26文字+ひらがな50音+α…面倒…

2-2.正規表現でがんばる
あらかじめPHPで '(s|S|s|S)(t|T|t|T)(r|R|r|R)' みたいな文字列を作っておいて
str_column ~ '(s|S|s|S)(t|T|t|T)(r|R|r|R)'
とする(MySQLの場合は ~ じゃなくて REGEXP).

いずれにしろコスト高いなー.

■ということで
あらかじめわかっているなら1.のほうが良いですね.
あとはテキスト全文検索で正規化機能を使うとか(というかこれが本命?).ただし標準で入ってないことも多いのでケースバイケース.
19:45:51 - nacky - Category: Com/Tech ( PHP , Database ) - No comments - No Trackbacks

2010-04-15

MySQLに中途半端な日付文字列を突っ込むとどうなるか

他人ソースを見てたら変なの発見.
date型に中途半端な文字列が突っ込まれている.

ということで早速実験.
CREATE TABLE datetest (
id NOT NULL,
idate NOT NULL DEFAULT '0000-00-00'
);
INSERT INTO datetest (id,idate) VALUES
(1,'201004'),
(2,'2010-04'),
(3,'2010-04-15'),
(4,'20100415');
SELECT * FROM datetest;
id idate
-- ----------
1 2020-10-04
2 0000-00-00
3 2010-04-15
4 2010-04-15
6桁数字列を年月日で解釈してる.中途半端にハイフンを入れたのは無視.

ちなみにPostgreSQLだと'2010-04'がエラーになり処理できませんでした.
あとの結果は同じ.

ちゃんと書式確認しようなー…
13:27:31 - nacky - Category: Com/Tech ( PHP ) - No comments - No Trackbacks

2010-03-08

PHP5.1でjson関係の関数を使う

CentOS5.4でのPHPはまだ5.1系なので,5.2系以降対応になっているjson関数(json_decode等)が使えません.
がんばってPHPを5.2に上げるという手もありますが,それは一苦労.
しかしマニュアルにある通りPECLでリリースされているので,追加してやれば使えます.
(むしろPECLであったものが5.2で標準になった)

# pecl install json
# echo 'extension=json.so' > /etc/php.d/json.ini
# service httpd restart

phpinfoでpeclを確認.問題なく動きました.
23:14:15 - nacky - Category: Com/Tech ( PHP ) - No comments - No Trackbacks

2010-02-12

PHPのサーバ環境変数とEZwebの挙動

PHPで$_SERVERを参照するとサーバ環境変数が取得できます.

このうち $_SERVER['HTTP_HOST'] と $_SERVER['SERVER_NAME'] は似て非なるものです.
HTTP_HOSTは,クライアントがリクエストヘッダ中でサーバに送ってくる Host ヘッダ.
SERVER_NAMEは,サーバ側が持ってる名前(VirtualHostのときはその名前).

大体の場合両者は一致するのですが,EZweb端末でSSL上のリクエストを行うと,HTTP_HOSTの末尾にポート番号が付きます.
https://example.com/ とすると
$_SERVER['HTTP_HOST']は example.com:443
$_SERVER['SERVER_NAME']は example.com
なんですな.

いずれにしろHTTP_HOSTのほうはブラウザが任意で送ってくるものなのでアテにしちゃいけません.
逆に443がほしければ $_SERVER['SERVER_PORT'] で取得できます.

PHP: $_SERVER - Manual
17:15:22 - nacky - Category: Com/Tech ( PHP ) - No comments - No Trackbacks

2010-01-27

PHPでbmpやtiffを扱いたい

PHPのGD関数だとimagecreatefromjpegとかでサクサクとjpegファイルを読み込めてとても便利なんですが,Windows BMPとtiffには対応していません.

Windows BMPに関してはDHKoldさんのimagecreatefrombmp関数(自力でbmpを読む)がありますのでありがたく使わせていただきます.
PHP: imagecreate - Manual #53879

じゃあtiffはどうするか.これがまた全然情報がない.
仕方ないのでとりあえずはtiff2pngという外部のプログラムを使うことにします.

tiff2png Home Page
PNG 利用術

Linux x86/glibc のバイナリがあるのでそちらをDL.
$ tiff2png -destdir <書き出し先> <tiffファイル>
動作確認.
あとはtmpnameなりを使ってテンポラリファイルを確保して,system()関数あたりで呼び出してやればOK.
# tiff2pngは-destdirを指定しないとカレントに書き出そうとするようで,パーミッション問題でややハマり.

追記
tiff2pngは拡張子.tiffや.tifだとリネームして.pngになってくれますが,tmpnameとかでテンポラリファイルとして拡張子なしのものを食わせると,後ろに.pngを追加したファイル名にしてくれます.

hogehoge.tif → hogehoge.png
hogehogetmp → hogehogetmp.png
20:54:54 - nacky - Category: Com/Tech ( PHP ) - No comments - No Trackbacks
«Prev || 1 | 2 | 3 || Next»