phpから同じMySQLサーバ内の複数DBを操作

以前からMySQL接続を二重に張れない問題が残っていてどうしたらC言語のようにできるのだろうと思っていたら今のMySQLではUSE等で切り替えなくてもDB名を指定して操作できる事を思い出しました。

今までは
USE test_db1;

SELECT * FROM table1;

USE test_db2;

SELECT * FROM table1;

のようにしていましたが、これは下記の様に書き換えられます。

SELECT * FROM test_db1.table1;

SELECT * FROM test_db1.table2;

しかもこの方法なら2つのDB内テーブルの結合もできるのでは?

MySQL5利用時のphpMyAdmin文字化け

またくだらないことに時間をつぶされた。orz
先日、レコードの照会を全てbinaryにすることで一応PHPからの入出力に文字化けの問題がなくなったのだが、相変わらずphpMyAdminがcharset=utf-8でページ出力するためにphpMyAdmin上でSJISデータが入力できないだけでなく、複数のレコードを選択したりすると画面上でタグが破壊されて操作不能に陥る。MySQL4.0の時はメインページのLanguageで『日本語 – Japanese(sjis)』を選択すればよかったのがMySQL5だと『日本語 – Japanese』しかなくそれがutf-8になっている。リストを見た感じ他の言語も全部utf-8しか選べないようになってるようだ。

それでhttpヘッダの方charset設定はどこだろうとgrepを駆使して探していたらどうもconfigになくてlibraries/database_interface.lib.phpにそれらしき記述がある。でもconfigでないのであまり弄りたくないので、ググって見ることにしたら…。やっぱりここしかないのか…。

要するにMySQL4.1以上はlibraries/database_interface.lib.phpを使用しないように分岐されていました。ということで以前のようにShift-JISやEUCを選択したときは、PMA_DBI_postConnect関数内のif (PMA_MYSQL_INT_VERSION >= 40100)を無効にしてelse部分だけを残しましょう。

function PMA_DBI_postConnect($link, $is_controluser = false)
{
(省略)
/* ←バッサリとコメントアウト
if (PMA_MYSQL_INT_VERSION >= 40100) {
(省略)
} else {*/
require_once(‘./libraries/charset_conversion.lib.php’);
//}

こうすれば分岐無視でcharset_conversion.lib.phpを読み込みます。

追記:
『if (PMA_MYSQL_INT_VERSION >= 40100) {』を『 if (false) {』にするだけでよかったな…。

参考:cl.pocari.org – MySQL 4.1.x な環境で phpMyAdmin を EUC-JP で使う方法
http://cl.pocari.org/2006-06-17-1.html

MySQL5で文字化けと格闘

まだ、自分の中では実績のないMySQL5ですがUTF8でページ作成していたときは問題なかったのがSJISでページ作成したら思ったとおり文字化け起こしました。結局は文字列の照合を全てbinaryにして解決しましたが、いろいろと改造してしまったので確定要素がない…。(ページ作成を落ち着いたらテーブル設定以外を元に戻してみます)

◆以下は落ち着いたら元に戻す項目

php.iniを導入して言語を日本語、システムの文字コードをSJISに設定して再起動
# cp php.ini-dist /usr/local/lib/php.ini
# ee /usr/local/lib/php.ini

編集項目
[mbstring]
mbstring.language = Japanese
mbstring.internal_encoding = SJIS

/etc/my.cnfにSJISの設定を追加

[mysqld]
default-character-set=sjis

[mysqldump]
default-character-set=sjis

[mysql]
default-character-set=sjis

と設定して再起動。
MySQLにログインしたあと下記のコマンドを発行して確認。

mysql> SHOW VARIABLES LIKE ‘character_set_%’;
+————————–+——-+
| Variable_name | Value |
+————————–+——-+
| character_set_client | sjis |
| character_set_connection | sjis |
| character_set_database | sjis |
| character_set_results | sjis |
| character_set_server | sjis |
| character_set_system | utf8 |
+————————–+——-+
6 rows in set (0.00 sec)

よくいろいろな薬を試して結果直ったけれど、どの薬が効いたのか分からない…そんな状況です。(多分、my.cnfやphp.iniの設定は不要だったきがしますが…)