4月
30
2014

さくらのVPSからGMOクラウドVPSへの移行

さくらのVPSを利用していましたが、コストパフォーマンスの良いGMOクラウドVPSに乗り換えることにしました。
その際の設定内容、移行手順を公開します。

移行プラン/料金

・プラン
 GMOクラウドVPS スモールプラン(1年間)
・金額
 4094円+2036×12円=28,526円(2377円/月)
・OS
 CentOS6.2 / LAMPPパック

Linuxの初期設定

GMOクラウドVPSの初期設定』を参考にサーバの初期設定を行う。

必要なパッケージをインストール

上記リンクに記載のない、wget、scpコマンドや、php関連のパッケージをインストール。

yum install wget
yum install openssh-clients
yum install php-mysql php-mbstring php-pdo php-pear
pear install pager

Apacheの初期設定

Apacheの初期設定すべき内容 (httpd.conf)』を参考にApacheを設定。
上記リンク先の記事には記載されていないが、ウェルカムページの設定も全てコメントアウトしておくこと。

cp -p /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
vi /etc/httpd/conf/httpd.conf
diff /etc/httpd/conf/httpd.conf /etc/httpd/conf/httpd.conf.org
vi /etc/httpd/conf.d/welcome.conf

MySQLの初期設定

MySQLの初期設定』を参考に、DBの初期設定を行う。
必要なDB、ユーザを作成しておいてください。

PHPの初期設定

cp -p /etc/php.ini  /etc/php.ini.org
vi /etc/php.ini
diff /etc/php.ini  /etc/php.ini.org
432c432
< expose_php = Off
<ul>
<li></li>
</ul>

&gt; expose_php = On
457c457
&lt; memory_limit = 512M
<ul>
<li></li>
</ul>

&gt; memory_limit = 128M
513c513
&lt; error_reporting = E_ALL &amp; ~E_NOTICE &amp; ~E_DEPRECATED
<ul>
<li></li>
</ul>

&gt; error_reporting = E_ALL &amp; ~E_DEPRECATED
946c946
&lt; date.timezone = Asia/Tokyo
<ul>
<li></li>
</ul>

&gt; ;date.timezone =
1542c1542
&lt; mbstring.language = Japanese
<ul>
<li></li>
</ul>

&gt; ;mbstring.language = Japanese
1549d1548
&lt; mbstring.internal_encoding = UTF-8
1553c1552
&lt; mbstring.http_input = auto
<ul>
<li></li>
</ul>

&gt; ;mbstring.http_input = auto
1558c1557
&lt; mbstring.http_output = UTF-8
<ul>
<li></li>
</ul>

&gt; ;mbstring.http_output = SJIS
1566c1565
&lt; mbstring.encoding_translation = Off
<ul>
<li></li>
</ul>

&gt; ;mbstring.encoding_translation = Off
1571c1570
&lt; mbstring.detect_order = auto
<ul>
<li></li>
</ul>

&gt; ;mbstring.detect_order = auto
1576c1575
&lt; mbstring.substitute_character = none;
<ul>
<li></li>
</ul>

&gt; ;mbstring.substitute_character = none;
1587c1586
&lt; mbstring.func_overload = 0
<ul>
<li></li>
</ul>

&gt; ;mbstring.func_overload = 0
1590c1589
&lt; mbstring.strict_detection = Off
<ul>
<li></li>
</ul>

&gt; ;mbstring.strict_detection = Off

Postfixの初期設定

cp -p /etc/postfix/main.cf /etc/postfix/main.cf.org
vi /etc/postfix/main.cf
diff /etc/postfix/main.cf /etc/postfix/main.cf.org
113c113
&lt; inet_interfaces = all
<ul>
<li></li>
</ul>

&gt; #inet_interfaces = all
116c116
&lt; #inet_interfaces = localhost
<ul>
<li></li>
</ul>

&gt; inet_interfaces = localhost
677,686d676
&lt;
&lt; ## add
&lt; smtpd_sasl_auth_enable = yes
&lt; smtpd_sasl_path = smtpd
&lt; smtpd_sasl_type = cyrus
&lt; smtpd_sasl_security_options = noanonymous
&lt; broken_sasl_auth_clients=yes
&lt; smtpd_recipient_restrictions = permit_mynetworks,permit_sasl_authenticated,reject_unauth_destination,permit_auth_destination,reject
&lt; smtpd_sasl_local_domain = iderea.com
&lt;
cp -p /etc/aliases /etc/aliases.org
vi  /etc/aliases
diff  /etc/aliases /etc/aliases.org
97,103d96
&lt;
&lt; # for iderea.com
&lt; hijikata:       h.hijikata@gmail.com
&lt; android-webrank:h.hijikata@gmail.com
&lt; android:h.hijikata@gmail.com
&lt; 360news:        h.hijikata@gmail.com
&lt;
newaliases
/etc/init.d/postfix restart

コンテンツ・DBの移行

/etc/crontabをコメントアウト

タイミングを考慮した上で、/etc/crontabをコメントアウトし、バッチ処理を停止する。

コンテンツのバックアップ

df、duコマンドで、ディスク容量に空きがあることを確認してから、コンテンツを丸ごとtarで固めます。

df -h
du -sh /tutty.info
tar cfz /tmp/tutty.info.tgz /tutty.info

コンテンツのリストア

移行先のサーバへ転送して、展開します。
最後に不要なファイルは削除します。

scp /tmp/tutty.info.tgz x.x.x.x:/tmp
ssh x.x.x.x
cd /
tar xfz /tmp/tutty.info.tgz
rm /tmp/tutty.info.tgz
exit
rm /tmp/tutty.info.tgz

DBのバックアップ

特定のデータベースを指定してバックアップします。

mysqldump -u root -p tutty | gzip > /tmp/tutty.sql.gz

DBのリストア

移行先サーバへ転送して、リストアします。
最後に不要なファイルは削除します。

scp /tmp/tutty.sql.gz x.x.x.x:/tmp
ssh x.x.x.x
gunzip /tmp/tutty.sql.gz
mysql -u root -p < /tmp/tutty.sql
rm /tmp/tutty.sql
exit
rm /tmp/tutty.sql.gz

DNSレコード修正&動作確認

基本的には、Aレコードを修正するだけで問題ない。
ドメイン及びIPアドレスでアクセスし、動作確認を行う。

/etc/crontabを設定

移行先サーバの/etc/crontabに、移行前と同様の設定をする。


 
12月
1
2013

PostfixでマルチドメインのSMTP Authに対応させる方法

PostfixでマルチドメインのSMTP Authに対応させる方法ですが、
ググってもなかなか見つからずに苦労したので、ポイントをメモ。

やりたいこと。

まず、実現したいことは、以下の通り。
・独自ドメインのメールアドレスを、GMailで管理する。
・独自ドメインは複数あり、1つのGMailアカウントで一括管理する。
・メールの送信時は、GMail上から、Fromを独自ドメインのメールアドレスに変更して送信する。
 (エンベロープFromも独自ドメインのメールアドレスに変更する)
・メール受信時は、GMailアカウントへ転送する。
・以上より、1つのGMailアカウント上で、べてのアカウントの送受信の操作も可能であり、すべての送受信メールが残ることになる。
・また、GMailを利用するため、どこからでも(スマホアプリからでも)利用可能である。
・担当者へのメール配信は、GMailの転送機能を利用して、GMailに来たメールをさらに転送する。
 ※担当者へのメール通知用であり、メールの送信はGMailから行う。

実現方法&ポイント

・Postfixで、SMTPサーバを立てる。
・複数ドメインのMXレコードをSMTPサーバへ紐付ける。
・Postfixのバーチャルドメイン設定で、GMailアカウントへメールを転送する。
・GMailのメールアドレス追加で、外部SMTPサーバ経由でメールを送信することで、エンベロープFROMも独自ドメインのメールアドレスでGMail上からメール送信することができる。
・その際に、SMTPサーバ側に下記SMTP-Authの設定が必要。
・SMTP Authの認証に使用するSASLには、SASLAUTHDとDovecotSASLの2種類ある。
・DovecotをSASL認証に利用して、複数ドメインでSMTP-Authができるよう設定する。
・saslauthdは、smtpd_sasl_local_domainに1つしかドメインを指定することができないため、マルチドメイン環境でSMTP-AUTHできない。
・DovecotはSASL認証のみに利用し、pop3等には利用しない。(※メール転送しているため、POP3は不要)
・sasl dovecotはマルチドメイン環境で認証することが可能。
・dovecotを使用する場合は、saslauthdのサービスは停止してもよい。


 
11月
12
2013

PHPフレームワーク Laravel まとめ

近年、注目されているPHPフレームワークLaravel(ララベル)の有用な情報を集めています。

※有用な情報があれば、お知らせください。

・Laravel 公式(英語)
http://laravel.com/

・日本語ドキュメント
http://laravel4.kore1server.com/docs

・Laravel技術記事
http://nextat.co.jp/staff/archives/category/php/laravel

・Laravel日本語ニュース(Facebook)
https://www.facebook.com/jp.laravel

・Composer再入門(Laravelインストール時にComposerを利用)
http://www.slideshare.net/shin1x1/composer-28109311


 
11月
12
2013

yumリポジトリを追加して、CentOSにPHP5.4のインストールする方法

yumリポジトリを追加(EPEL Remi、RPMForge)

リポジトリのインストール

CentOS標準リポジトリで提供されていないパッケージをインストールするために、
サードパーティ製リポジトリのEPEL Remi、RPMForgeを追加します。

rpm -ivh http://ftp-srv2.kddilabs.jp/Linux/distributions/fedora/epel/6/x86_64/epel-release-6-8.noarch.rpm
rpm -ivh http://rpms.famillecollet.com/enterprise/remi-release-6.rpm
rpm -ivh http://pkgs.repoforge.org/rpmforge-release/rpmforge-release-0.5.2-2.el6.rf.x86_64.rpm

以下のコマンドでインストールされたことを確認します。

rpm -qa|grep epel-release
rpm -qa|grep remi-release
rpm -qa|grep rpmforge-release

デフォルト無効(enabled=0)にする

デフォルトでリポジトリを使用しないよう無効にします。
設定ファイル内のenabled=1となっている個所をenabled=0に変更します。

# EPEL
cp -p /etc/yum.repos.d/epel.repo /etc/yum.repos.d/epel.repo.`date +%Y%m%d`
vi /etc/yum.repos.d/epel.repo
# Remi
cp -p /etc/yum.repos.d/remi.repo /etc/yum.repos.d/remi.repo.`date +%Y%m%d`
vi /etc/yum.repos.d/remi.repo
# RPMForge
cp -p /etc/yum.repos.d/rpmforge.repo /etc/yum.repos.d/rpmforge.repo.`date +%Y%m%d`
vi /etc/yum.repos.d/rpmforge.repo

PHP5.4をインストール

デフォルトでは、リポジトリは使用されませんので、
–enablerepo=epel,remi,rpmforgeを付けて、インストールします。

yum --enablerepo=epel,remi,rpmforge install php

リポジトリの中でバージョンの一番高いものがインストールされます。

参考

http://dqn.sakusakutto.jp/2013/02/centos6_yum_remi……forge.html


 
11月
11
2013

MySQLの初期設定

MySQL 5.1.52の初期設定についてまとめます。

my.cnfの設定

my.cnfの設定を行います。

cp -p /etc/my.cnf /etc/my.cnf.org
vi /etc/my.cnf

以下の通り変更します。

[mysqld]
datadir=/var/lib/mysql
socket=/var/lib/mysql/mysql.sock
user=mysql
# Disabling symbolic-links is recommended to prevent assorted security risks
symbolic-links=0

character_set_server=utf8
default-storage-engine=InnoDB
innodb_file_per_table

[mysql]
default-character-set=utf8

[mysqldump]
default-character-set=utf8

[mysqld_safe]
log-error=/var/log/mysqld.log
pid-file=/var/run/mysqld/mysqld.pid

MySQLを再起動して、設定を反映します。

/etc/init.d/mysqld restart

ユーザ設定

初期状態確認

まずは、MySQLに接続して、ユーザ一覧を表示します。

mysql -u root mysql
mysql> select host,user,password from user;
 +-----------------------+------+----------+
 | host                  | user | password |
 +-----------------------+------+----------+
 | localhost             | root |          |
 | localhost.localdomain | root |          |
 | 127.0.0.1             | root |          |
 | localhost             |      |          |
 | localhost.localdomain |      |          |
 +-----------------------+------+----------+
5 rows in set (0.00 sec)

ユーザ設定

MySQLユーザを以下の通り設定します。

1.全ユーザ削除
2.rootユーザ作成(全DB管理者用)
3.userユーザを作成(特定DB用)
mysql> delete from user;
mysql> GRANT ALL ON *.* TO root@'127.0.0.1' IDENTIFIED BY 'pass' WITH GRANT OPTION;
mysql> GRANT ALL ON *.* TO root@'localhost' IDENTIFIED BY 'pass' WITH GRANT OPTION;
mysql> GRANT ALL ON *.* TO root@'localhost.localdomain' IDENTIFIED BY 'pass' WITH GRANT OPTION;
mysql> GRANT ALL ON database.* TO user@'127.0.0.1' IDENTIFIED BY 'pass';
mysql> GRANT ALL ON database.* TO user@'localhost' IDENTIFIED BY 'pass';
mysql> GRANT ALL ON database.* TO user@'localhost.localdomain' IDENTIFIED BY 'pass';
mysql> select host,user,password from user;
 +-----------------------+------+-------------------------------------------+
 | host                  | user | password                                  |
 +-----------------------+------+-------------------------------------------+
 | 127.0.0.1             | user | ***************************************** |
 | localhost             | user | ***************************************** |
 | localhost.localdomain | user | ***************************************** |
 | 127.0.0.1             | root | ***************************************** |
 | localhost             | root | ***************************************** |
 | localhost.localdomain | root | ***************************************** |
 +-----------------------+------+-------------------------------------------+
3 rows in set (0.00 sec)

不要なデータベースを削除

testデータベースを削除します。

mysql> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 | test               |
 +--------------------+
3 rows in set (0.00 sec)

mysql> drop database test;
Query OK, 0 rows affected (0.01 sec)

mysql> show databases;
 +--------------------+
 | Database           |
 +--------------------+
 | information_schema |
 | mysql              |
 +--------------------+
2 rows in set (0.00 sec)

データベースを作成

sampleデータベースを作成します。

mysql> create database sample;

PHPMyAdminを使用して、残りの設定を行います。


 
11月
11
2013

GMOクラウドVPSの初期設定

GMOクラウドVPSを借りた時に、初期設定すべき内容・方法をまとめておきます。
※さくらのVPSや、その他クラウドサービスでも、Linuxサーバであれば同様です。

グループ・ユーザを作成

グループ作成

ユーザを作成する前に、グループを作成しておきます。
ここでは、GID=1000 の staffグループを作成します。

groupadd -g 1000 staff

ユーザ作成

staffグループに所属する、UID=1982のtuttyユーザを作成します。
鍵認証を利用するため、パスワードは設定しません。(ロック状態になります)

useradd -g staff -u 1982 tutty

SSHの設定

セキュリティ対策のため、パスワード認証を禁止し、鍵認証を利用します。
※鍵認証の仕組みや、鍵の作成方法は省略します。

認証用の鍵を作成

まず、PuTTY付属のputtygenなどを利用して、秘密鍵、公開鍵を作成してください。
作成した秘密鍵をローカルPCに厳重に保管します。
そして、作成した公開鍵はサーバへ登録します。

su - tutty
mkdir .ssh
vi .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

authorized_keysの中身は、以下の形となります。

ssh-rsa AAAAB3NzaC1yc2・・・(略)

鍵の登録が終わったら、PuTTYやWinSCPなどで、鍵認証の接続を確認してください。

SSHDの設定

セキュリティ対策として、sshdの設定を変更し、
・rootユーザでのログイン
・パスワード認証
を禁止します。

vi /etc/ssh/sshd_config

変更内容は下記の通り。

PermitRootLogin no
PasswordAuthentication no

下記コマンドにより、設定内容を反映します。

/etc/init.d/sshd reload

SFTP専用アカウントを作成

WEB担当者がサーバにHTMLファイルをアップロードする場合など、
サーバ管理者以外の人が利用するSFTP専用アカウントを作成する場合は、以下の記事参照。
SFTP専用アカウントを作成(ログインシェル無効化、鍵認証、chroot対応)


 
11月
8
2013

SFTP専用アカウントを作成(ログインシェル無効化、鍵認証、chroot対応)

SFTP専用アカウント作成の要件

WEB担当者がサーバにHTMLファイルをアップロードする場合など、
サーバ管理者以外の人が利用するSFTP専用アカウントを作成する方法を紹介します。

セキュリティ対策のため、以下の点に注意します。

・FTPではなく、鍵認証のSFTP、SCPを利用
・シェルによるログインを禁止
・特定のディレクトリ以下のみ参照可能(chroot)

ユーザ作成

まず、ユーザを作成します。
ここでは、staffグループに所属するUID=1983のwebユーザを作成します。

useradd -g staff -u 1983 web

SSHの設定

セキュリティ対策のため、パスワード認証を禁止し、鍵認証を利用します。
※鍵認証の仕組みや、鍵の作成方法は省略します。

認証用の鍵を作成

まず、PuTTY付属のputtygenなどを利用して、秘密鍵、公開鍵を作成してください。
作成した秘密鍵をローカルPCに厳重に保管します。
そして、作成した公開鍵はサーバへ登録します。

su - web
mkdir .ssh
vi .ssh/authorized_keys
chmod 700 .ssh
chmod 600 .ssh/authorized_keys

authorized_keysの中身は、以下の形となります。

ssh-rsa AAAAB3NzaC1yc2・・・(略)

鍵の登録が終わったら、PuTTYやWinSCPなどで、鍵認証の接続を確認してください。

ログインシェルを無効化

ログインシェルを/sbin/nologinへ変更し、シェルを利用できなくします。

usermod -s /sbin/nologin web

指定ディレクトリのみ参照可能にする(chroot)

以前は、追加パッケージが必要でしたが、
OpenSSH4.9以降はchrootに対応しているため、
他のパッケージをインストールすることなく設定できます。

SSHDの設定を変更します。

vi /etc/ssh/sshd_config

変更内容は下記の通り。

#Subsystem      sftp    /usr/libexec/openssh/sftp-server
Subsystem       sftp    internal-sftp

Match User web
    ChrootDirectory /var/www
    ForceCommand internal-sftp

SFTPの接続を処理するサブシステムを、標準のsftp-serverからsshd内部のinternal-sftpに変更。
webユーザが/var/wwwにchrootされるよう設定しました。

SSHDをリロードして、設定を反映します。

/etc/init.d/sshd reload

以下を確認できれば成功です。

・SSH接続はできないこと
・SFTP接続でき、指定ディレクトリ以下にchrootされること

SFTP専用アカウントを利用するWeb担当者には、
以下を教えてあげましょう。

・WinSCPのダウンロードURL
  http://www.forest.impress.co.jp/library/software/winscp/
・プロトコル:SFTP
・ホスト名
・ユーザ名:web
・秘密鍵
・秘密鍵のパスワード
・ディレクトリ構造

 
11月
8
2013

Apacheの初期設定すべき内容 (httpd.conf)

Apacheの初期設定すべき内容をまとめました。
マルチドメインを想定して、バーチャルホストの設定もしています。

設定時のApacheのバージョンは、2.2.15です。

ApacheやOS等のバージョンを非表示にする

Apacheはデフォルトで、Apache、OS、PHPなどのバージョンを
HTTPレスポンスヘッダを含めたり、デフォルトのエラーページに表示させたりします。
この情報を最小限に抑止するために、「ServerTokens」、「ServerSignature」を下記の通り設定します。

ServerTokens Prod
ServerSignature Off

使用しないデフォルト設定をコメントアウト

htmlディレクトリは使用しないため、コメントアウト。

#<Directory "/var/www/html">
#    Options Indexes FollowSymLinks
#    AllowOverride None
#    Order allow,deny
#    Allow from all
#</Directory>

iconsディレクトリは使用しないため、コメントアウト。

#Alias /icons/ "/var/www/icons/"
#<Directory "/var/www/icons">
#    Options Indexes MultiViews FollowSymLinks
#    AllowOverride None
#    Order allow,deny
#    Allow from all
#</Directory>

cgi-binディレクトリは使用しないため、コメントアウト。

#ScriptAlias /cgi-bin/ "/var/www/cgi-bin/"
#<Directory "/var/www/cgi-bin">
#    AllowOverride None
#    Options None
#    Order allow,deny
#    Allow from all
#</Directory>

ディレクトリインデックス機能は使用しないため、コメントアウト。

#IndexOptions FancyIndexing VersionSort NameWidth=* HTMLTable Charset=UTF-8
#AddIconByEncoding (CMP,/icons/compressed.gif) x-compress x-gzip
#AddIconByType (TXT,/icons/text.gif) text/*
#AddIconByType (IMG,/icons/image2.gif) image/*
#AddIconByType (SND,/icons/sound2.gif) audio/*
#AddIconByType (VID,/icons/movie.gif) video/*
#AddIcon /icons/binary.gif .bin .exe
#AddIcon /icons/binhex.gif .hqx
#AddIcon /icons/tar.gif .tar
#AddIcon /icons/world2.gif .wrl .wrl.gz .vrml .vrm .iv
#AddIcon /icons/compressed.gif .Z .z .tgz .gz .zip
#AddIcon /icons/a.gif .ps .ai .eps
#AddIcon /icons/layout.gif .html .shtml .htm .pdf
#AddIcon /icons/text.gif .txt
#AddIcon /icons/c.gif .c
#AddIcon /icons/p.gif .pl .py
#AddIcon /icons/f.gif .for
#AddIcon /icons/dvi.gif .dvi
#AddIcon /icons/uuencoded.gif .uu
#AddIcon /icons/script.gif .conf .sh .shar .csh .ksh .tcl
#AddIcon /icons/tex.gif .tex
#AddIcon /icons/bomb.gif core
#AddIcon /icons/back.gif ..
#AddIcon /icons/hand.right.gif README
#AddIcon /icons/folder.gif ^^DIRECTORY^^
#AddIcon /icons/blank.gif ^^BLANKICON^^
#DefaultIcon /icons/unknown.gif

コンテントネゴシエーション機能は使用しないため、コメントアウト。

##AddHandler type-map var

SSIは使用しないため、コメントアウト。

#AddType text/html .shtml
#AddOutputFilter INCLUDES .shtml

マルチドメイン対応のVirtualHostを設定

※環境に合わせて設定値を変更してください。

NameVirtualHost *:80
<VirtualHost *:80>
    ServerAdmin webmaster@tutty.info
    DocumentRoot /var/www_chroot/tutty.info/www
    ServerName tutty.info
    ErrorLog /var/www_chroot/tutty.info/logs/tutty.info-error_log
    CustomLog /var/www_chroot/tutty.info/logs/tutty.info-access_log combined
    <Directory "/var/www_chroot/tutty.info/www">
        AllowOverride All
        Options       FollowSymLinks
        Order         allow,deny
        Allow         from all
   </Directory>
</VirtualHost>

補足

私が普段使用しているWeb関連のディレクトリ構成は、下記の通りです。
ドメイン単位でディレクトリを分けています。

# Apacheログディレクトリ
 /var/www_chroot/(ドメイン名)/logs/
# ドキュメントルート
 /var/www_chroot/(ドメイン名)/www/
# ドキュメントルート外(非公開用)
 /var/www_chroot/(ドメイン名)/work/

※ルートフォルダに、ドメイン名のシンボリックリンクを張ると使いやすいです。
※必要に応じて変更してください。


 
10月
15
2012

MySQLでひらがな、カタカナ、大文字、小文字、全角、半角を区別しないで検索する方法

例えば、「りんご」という商品がDBに登録されている場合に、
ひらがなで検索すればよいのか、カタカナで検索すればよいのかわからなくなるときがあります。

MySQLでは、照合順序にutf8_unicode_ciを指定することで、似た文字を同一視して扱い、どちらでも検索することができます。

たとえば、
・「りんご」「リンゴ」「リンゴ」「りンゴ」
・「ABC」「ABC」「abc」「Abc」
・「123」「123」「123」
など、半角、全角、ひらがな、カタカナ、大文字、小文字も関係なく、検索にヒットさせることができるようになります。

utf8_unicode_ciの使用方法

utf8_unicode_ciは、テーブル定義の時に指定することができますが、
検索時に指定することも可能です。

例)

select * from item where item_name collate utf8_unicode_ci like '%りんご%';

DBのitem_nameに「りんご」「リンゴ」「リンゴ」「りンゴ」で登録されていても、検索することができます。

utf8_unicode_ciでできること

・アルファベットが、半角/全角、大文字/小文字にかかわらず、検索可能
・数字が、半角/全角にかかわらず、検索可能
・平仮名、カタカナ、半角カナにかかわらず、検索可能
※同一視される文字が他にもあるため、広範囲で検索にヒットするため、注意も必要です
 例)「つ」「っ」なども同一視
 例)「は」「パ」「バ」などの濁点等も同一視

同一視される文字の一覧

以下に同一視される文字の表がまとめられています。
http://tmtm.org/tmp/mysql_unicode_collation.html

参考

http://d.hatena.ne.jp/end0tknr/20100613/1276427626
http://tmtms.hatenablog.com/entry/20110416/mysql_u……_collation
http://tmtm.org/tmp/mysql_unicode_collation.html


 
10月
15
2012

MySQLで半角/全角スペースを無視して検索する方法

MySQLのreplace関数を使用

MySQLには、文字列を置換するreplace関数を利用できるので、これを使用します。

replace(str,from_str,to_str)

strに含まれるfrom_strを検索し、to_strに置換します。

例:半角/全角スペースを無視して検索する場合

select * from table where replace(replace(key,' ',''),' ','') like '%検索文字列%'

フィールドkeyから半角/全角スペースを削除して、検索文字列で部分一致させています。

PHPから利用する場合

PHPで利用する場合には、入力した検索文字列からも空白を削除しましょう。
以下にPHPで入力文字列から空白を削除して、pdoの検索文字列(:KEY)にバインドする方法を記述します。

// 例:pdoで検索文字列(:KEY)をバインドする方法
//   ※\sは[ \t\n\f\r]と同義です
//   ※utf-8の場合、preg_replaceの修飾子に'u'が必要です
$stmt->bindValue(':KEY','%' . preg_replace('/[\s ]/u','',$key) . '%');


ページ:1234»
このエントリーをはてなブックマークに追加