mysqladminでデータベース作成の際に文字コードを設定しようとしたらうまくいかないので、mysqlクライアントを利用する。
CREATE DATABASE {database} CHARACTER SET utf8;
ユーザーの追加。
CREATE USER '{user}'@'%' IDENTIFIED BY '{password}';
ユーザー権限の設定。
該当データベースしか処理させない。
GRANT SELECT, INSERT, UPDATE, DELETE, CREATE, DROP, INDEX, ALTER, CREATE TEMPORARY TABLES, CREATE VIEW, SHOW VIEW, CREATE ROUTINE, ALTER ROUTINE, EXECUTE ON {database} . * TO '{user}'@'%' IDENTIFIED BY '{password}';
これで該当データベースのみしかアクセスできない。
該当データベース名でのみcreate(drop) databaseは可能はです。
phpMyAdminで管理以外の権限を選定しましたが、実際不要な権限も多いと思います。
FILEはグローバルレベルのため、以下のエラーがでて権限付与できません。
ERROR 1221 (HY000): Incorrect usage of DB GRANT and GLOBAL PRIVILEGES
DB
mysql
たとえば”2009-02-01″という文字列はtimestamp型にキャストされる際に、”2009-02-01 00:00:00″として扱われます。
なので、以下のようなデータベースがあった場合。
mysql> select * from hoge;
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2009-02-01 00:00:00 |
| 2 | 2009-02-01 00:00:01 |
+----+---------------------+
2 rows in set (0.00 sec)
2月1日を取得したい場合、以下は間違い。
mysql> select * from hoge where created_at = '2009-02-01';
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2009-02-01 00:00:00 |
+----+---------------------+
1 row in set (0.00 sec)
date型でキャストして比較するか、今日以降次の日より前の条件にする。
mysql> select * from hoge where date(created_at) = '2009-02-01';
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2009-02-01 00:00:00 |
| 2 | 2009-02-01 00:00:01 |
+----+---------------------+
2 row in set (0.00 sec)
mysql> select id, created_at from chat where created_at >= '2009-02-01' and created_at < '2009-02-02';
+----+---------------------+
| id | created_at |
+----+---------------------+
| 1 | 2009-02-01 00:00:00 |
| 2 | 2009-02-01 00:00:01 |
+----+---------------------+
2 rows in set (0.00 sec)
DB
mysql
PostgreSQLの7.4.Xの環境でDBをSQL_ASCII、PHPでclient_encodingをSJISで利用していたらリストアができないらしい。
実行環境はRedHat8系でした。
$ pg_dump backup | psql restore
確かにうまくいかない。
$ pg_dump backup > backup.dump
dumpファイル見てみると、先頭部分で「SET client_encoding = ‘EUC-JP’;」エラー発生した部分みてみるとデータの欠落がありました。
pg_dumpって特にエラーとか吐かないんですね。
リストアできないっていってたけど、問題はダンプがしっかりできないことっぽい。
ということでpg_dumpでクライアントエンコーディングを指定してあげることに。
$ export PGCLIENTENCODING=SJIS
$ pg_dump backup > backup.dump
$ psql restore < backup.dump
おゃできましたよ?
マイナー(リビジョン)バージョンでの差は知らん。
DB
MySQLは5.0から。
それより前では利用されるインデックスはひとつのみ。
複合インデックスを利用しましょう。
適当にぺちぺち無駄なインデックス張るなと。
regist_dateとかいうtimestamp型にインデックス張ったらほぼ全レコード数のインデックスが。
そもそもregistなんて単語ないんですよ、registerならありますけど。
EXPLAINで常にクエリのコストをチェックしてくださいマジで。
うぉー。
DB
MySQLでストアドプロシージャが使えるといまさら知ったのでさわりだけ。
たぶんその2はない。
phpMyAdminで叩いていてみたけど他のとこでエラーでるというかそもそも対応していない。
えくすぽーとに関しては2.9.0から対応してるみたいだけど。
とりあえず直接叩いてみた。
mysql> CREATE DATABASE sample;
Query OK, 1 row affected (0.17 sec)
mysql> CREATE TABLE sample(
-> id INT(11) NOT NULL auto_increment PRIMARY KEY,
-> name VARCHAR(32) NOT NULL,
-> age INT(11) NOT NULL
-> );
Query OK, 0 rows affected (0.94 sec)
mysql> INSERT INTO sample(name, age) VALUE('yotsuba', 14);
Query OK, 1 row affected (0.09 sec)
mysql> SELECT * FROM sample;
+----+---------+-----+
| id | name | age |
+----+---------+-----+
| 1 | yotsuba | 14 |
+----+---------+-----+
1 row in set (0.04 sec)
mysql> DELIMITER |
mysql> CREATE PROCEDURE sample1()
-> BEGIN
-> SELECT name, age FROM sample;
-> END
-> |
Query OK, 0 rows affected (0.51 sec)
mysql> DELIMITER ;
mysql> CALL sample1;
+---------+-----+
| name | age |
+---------+-----+
| yotsuba | 14 |
+---------+-----+
1 row in set (0.00 sec)
Query OK, 0 rows affected (0.02 sec)
んで、PHPから。
mysql利用してみるとエラーでて、エラーコードみると利用は不可能そうだったので、mysqliから。
PDOからでも大丈夫らしい。
query('call sample1')) {
print $mysqli->errno();
print $mysqli->error();
exit;
}
while ($row = mysqli_fetch_assoc($res)) {
var_dump($row);
}
?>
DB