Archive

Archive for the ‘DB’ Category

MySQLのデータベース作成、ユーザー作成、アクセス権限設定

3月 3rd, 2009

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の文字列からtimestampへのキャストについて

2月 4th, 2009

たとえば”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

原因の切り分けをしっかりしましょう

4月 10th, 2008

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

PostgreSQLのインデックスマージは8.1以降

7月 27th, 2007

MySQLは5.0から。

それより前では利用されるインデックスはひとつのみ。
複合インデックスを利用しましょう。

適当にぺちぺち無駄なインデックス張るなと。
regist_dateとかいうtimestamp型にインデックス張ったらほぼ全レコード数のインデックスが。
そもそもregistなんて単語ないんですよ、registerならありますけど。

EXPLAINで常にクエリのコストをチェックしてくださいマジで。

うぉー。

DB

MySQL5.0からストアドプロシージャが利用できるらしい その1

7月 12th, 2007

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