Technology

PerlからMySQLに日本語を含むレコードを登録する際の文字化け対策

set namesを使うといいみたいです。

use strict;
use warnings;
use utf8;
use DBI;

my $dbh = DBI->connect($datasource, $username, $password);

# set namesを使う
$dbh->do('set names utf8');

$dbh->do('insert into SAMPLETABLE (`hoge`) values "ほげ"');

ただ、PHPの業界ではset namesを使用することはダメであることが言われています。WWWブラウザのフォームから受け取った、ユーザの入力に対して、PHPで処理する場合は、SET NAMESなどには脆弱性があるようです。

SET NAMESは禁止
http://blog.ohgaki.net/set_namesa_mcb_asc

SET NAMESが危険な理由のおさらい
http://www.bpsinc.jp/blog/archives/1133

SET NAMESは禁止?
http://cakephp.seesaa.net/article/52562968.html

PHPからSET NAMESを使わない方が良い理由と対策まとめ
http://nonn-et-twk.net/twk/why-set-names-in-php-is-bad

ただ、これらはPHPだけの問題なのか不明な上、そもそもこれらの話題が、現時点で2以上年前の話題であるため、もしかしたら、何か対策が打たれているか、そもそもset namesを使わないように技術書などに書かれているのかもしれません。

SQLインジェクションの対策は必要であることは念頭に入れたうえで、ユーザの入力の余地がない部分に対しては、とりあえず、set namesで解決できそうです。


Topic