カテゴリー
MySQL

MySQLのINT等の整数型カラム(UNSIGNED)から減算する時に注意

MySQL4.xでは大丈夫だったけど、MySQL5.xに移行してから起こった出来事。

整数型カラムをUNSIGNEDして利用している時、負の数にならないのをいい事に0から減算して負の数の場合は0と自動で処理してくるものだと思っていた。(MySQL4.x時にはそのように処理されていた。)

本当はプログラム側で処理するべきなのかもしれないけれど、楽してそのようなスクリプトを書いていた。

で、先日MySQL5.xの環境に移行したらデータがおかしくなっていた。

とてつもなく大きな数字となっており???状態。

どうやら、UNSIGNEDしているカラムが0で、そこから1を引くと4294967295のような値になってしまうようだ。

これを回避するにはコマンドラインオプションで

--sql-mode=NO_UNSIGNED_SUBTRACTION

とするか、SQL発行時に

SET SQL_MODE='NO_UNSIGNED_SUBTRACTION';

とすると大丈夫のようだ。

参考: http://mlog.euqset.org/archives/ml@mysql.gr.jp/14844.html

カテゴリー
CentOS5.x MySQL postfix メールサーバ

CentOS5.3 PostfixをMySQL対応にする

2013-01-13追記
MySQL対応のPostfixはCentOS Plusリポジトリを使えばyumでupdate出来るみたい。こっちの方がいいね。

CentOS Plusリポジトリを有効にする

# vi /etc/yum.repos.d/CentOS-Base.repo

[centosplus]
name=CentOS-$releasever - Plus
mirrorlist=http://mirrorlist.centos.org/?release=$releasever&arch=$basearch&repo=centosplus
#baseurl=http://mirror.centos.org/centos/$releasever/centosplus/$basearch/
gpgcheck=1
#enabled=0
enabled=1  # ←有効にする
gpgkey=file:///etc/pki/rpm-gpg/RPM-GPG-KEY-CentOS-5

yumでpostfixをupdate

# yum update postfix

...


===================================================================
 Package           Arch   Version               Repository    Size
===================================================================
Updating:
 postfix           i386   2:2.3.3-2.3.0.1.el5.centos.mysql_pgsql
                                                centosplus   3.7 M

...

mysql対応になっているかの確認。mysqlと出れば対応している。

# postconf -m|grep mysql
mysql

参考:postfixadmin + mysql + courier-imapによるバーチャルドメイン

以下古い記事


2010-12-04追記
どうやらCentOS5.5ではRPMが用意されている模様
64bit http://ftp.riken.jp/Linux/centos/5.5/centosplus/x86_64/RPMS/postfix-2.3.3-2.1.centos.mysql_pgsql.x86_64.rpm
32bit http://ftp.riken.jp/Linux/centos/5.5/centosplus/i386/RPMS/postfix-2.3.3-2.1.centos.mysql_pgsql.i386.rpm
あれ?前からあったのか??

yumでインストールされていたらアンインストール

yum erase postfix

ダウンロード

最新版の確認(/5.x/centosplus/SRPMS/より)

rpm -ivh http://ftp.riken.jp/Linux/centos/5.4/centosplus/SRPMS/postfix-2.3.3-2.1.centos.mysql_pgsql.src.rpm

コンパイル前の下準備

Postfix をMySQL対応にするためpostfix.specを編集。

cd /usr/src/redhat/SPECS/
vi postfix.spec
..
%define MYSQL 1 ←確認(0なら1に修正)
%define PGSQL 0 ←postgreSQLを使わないなら1から0に修正
..

コンパイル

srpmからrpmを作成する。

エラー: ビルド依存性の失敗:
pcre-devel は postfix-2.3.3-2.1.centos.mysql_pgsql.i386 に必要とされています

などのエラーが出たら
yum install pcre-devel
でインストール後に再度実行。

rpmbuild -bb postfix.spec

インストール

出来上がったRPMをインストールする。

cd /usr/src/redhat/RPMS/i386/
rpm -ivh postfix-2.3.3-2.1.centos.mysql_pgsql.i386.rpm

yumの自動アップデートから外す

yum update で postfix* なパッケージがアップデートされなくなる。

これをしないとyumの自動アップデート時にMySQL非対応に戻ってしまう。

vi /etc/yum.conf
exclude=postfix* ←最終業に追記

↑手動でもやりましたけど
Postfixをyumでアップデートしてしまった orz...

カテゴリー
MySQL

MySQL DATETIME型へのINDEX注意点

MySQLのDATETIME型へインデックスをつける場合注意が必要。
例えばこんなSQLではインデックスが使用されない。

SELECT * FROM  `table` WHERE  `datetime` LIKE  '2009-05-17%'
検索結果は2009-05-17分全てが抽出されるが、フルスキャンがかかる。 この場合、以下のようなSQLが良い。
SELECT * FROM  `table` 
WHERE  `date_time` BETWEEN '2009-05-17' AND '2009-05-17' + INTERVAL 1 DAY

実行時間計測の例
行数:13,776行
データ:2,935KB
インデックス:datetime


SELECT SUM(  `col` ) FROM  `table` 
WHERE  `datetime` LIKE  '2009-05-17%'

フルスキャン
実行時間:0.0235 秒


SELECT SUM(  `col` ) FROM  `table`
WHERE  DATE(datetime) =  '2009-05-17'

フルスキャン
実行時間:0.0383 秒


SELECT SUM(  `col` ) FROM  `table`
WHERE `date_time` BETWEEN  '2009-05-17' AND  '2009-05-17' + INTERVAL 1 DAY

インデックス使用
実行時間:0.0009 秒

カテゴリー
MySQL

DBIでMysql を使う時の文字コード指定

接続時

my $dbh = DBI->connect(
'DBI:mysql:database=sandbox;host=localhost;mysql_read_default_file=/etc/mysql/my.cnf',
qw/id password/,
);

または接続後に

$dbh->{ mysql_enable_utf8 } = 1;


この辺の記事
http://www.geminium.com/chiba_blog/2009/02/

カテゴリー
MySQL phpmyadmin

PhpMyAdminの導入

phpmyadminインストール

yum install phpmyadmin

/usr/share/phpmyadmin にインストールされる。
/usr/share/phpmyadmin/config.inc.phpを編集
$cfg['blowfish_secret']を設定。

/*
* This is needed for cookie based authentication to encrypt password in
* cookie
*/
$cfg['blowfish_secret'] = '*************'; /* YOU MUST FILL IN THIS FOR COOKIE AUTH! */

「mcrypt 拡張をロードできません。PHP の設定を確認してください」というエラーが出たのでインストール。

yum -y install php-mbstring
yum -y install php-mcrypt

phpでマルチバイト処理をするには「php-mbstring」が必要.
CentOS5だと上記でよいが、CentOS4だとインストールされない。

CentOS4での手順
1.mcryptを組み込むのに必要なlibmcryptをrpmforgeからインストールします。

# yum -y --enablerepo=rpmforge install libmcrypt-devel

2.php用のmcrypt拡張モジュールをPHPRPMsよりダウンロードします。

# cd /usr/src/redhat/RPMS/i386/
# wget http://jaist.dl.sourceforge.net/sourceforge/phprpms/php-mcrypt-4.3.9-3.2.1.i386.rpm

最新版は http://phprpms.sourceforge.net/mcrypt で確認して下さい。
CentOSはRHEL互換なのでRHEL4の物を落としました。
X86_64で無いならばi386で問題ありません。

3.ダウンロードしたrpmをインストールします。

# rpm -Uvh php-mcrypt-4.3.9-3.2.1.i386.rpm

参考: http://centossrv.com/bbshtml/webpatio/364.shtml

・・・が、http://phprpms.sourceforge.net/mcryptは現在無い...。
しょうがないので、http://rpm.pbone.net/で探す。
キーワード「php-mcrypt」CentOS 4 とRedHat EL 4 にチェックを入れサーチ。

# php -v

でPHP 4.3.9dだったので、
RedHat EL 4 ftp.sourceforge.net/pub/sourceforge/p/project/ph/phprpms/RHEL4 PHP RPMs/4.3.9-3.2/php-mcrypt-4.3.9-3.2.1.i386.rpm
http://rpm.pbone.net/index.php3/stat/4/idpl/12753489/com/php-mcrypt-4.3.9-3.2.1.i386.rpm.html

が、見つかったのでこれを使ってみる。

# wget ftp://ftp.pbone.net/mirror/ftp.sourceforge.net/pub/sourceforge/p/project/ph/phprpms/RHEL4%20PHP%20RPMs/4.3.9-3.2/php-mcrypt-4.3.9-3.2.1.i386.rpm

rpm -ivh php-mcrypt-4.3.9-3.2.1.i386.rpm

成功した。

Apacheの設定。
/etc/httpd/conf.d/phpmyadmin.conf が作成されるので適時修正。
Apache再起動。