2009年9月25日金曜日

【備忘録】mysqlインストール

 PHPで、DBを操作しつつ、色々動作確認したくて、自宅のPC、Windows VISTAに、mysqlを入れみた。&今後のコマンドコピペ用に備忘録。

 ちなみに、PHPを使い始めの頃に手にとったのは、MySQLコマンドブック 第2版 (コマンドブックシリーズ)と、セキュリティ面がイマイチな気がするので、そこは、オライリー本、入門PHPセキュリティなんかと併読しながら。
 MySQLコマンドブックの方は、Perl、PHPで、MySQLに接続してデータをコネくる時の基本的なサンプルCGIが、万遍なく掲載されている点がヨイと考えられます。
 とりあえず、他のDB、Perlは少しかじった事があるが、MySQL、PHPは初めて、という自分の様なパターンの方はツボだと思います。
 ただ、ある程度PHPやMySQLを使ってのCGI作りに慣れてきたら、ほぼ見なくなる本なのかもしれません。マニュアル、リファレンスなら最新版がWebで見れたりするので。

---------------------------------------------------------------
1/11.mysql ダウンロード&インストール(win)
---------------------------------------------------------------
※ インストール後にプログラム削除し、再度一回インストールしようとするとインストールに失敗する。
※ 回避策は調べればありそうだが、Windowsのレジストリエディタ、"HKEY_LOCAL_MACHINE"を"mysql"で検索し、消してもよさそうな設定は全て削除していった方が、そう何度もする事では無いので、楽な気がする(爆)。
※ 現在(2009/09)は、とりあえず安定そうな、バージョン5.0.xを選ぶ。

ダウンロードサイト

----------------------------
2/11.Win PCの設定
----------------------------
(1) FW設定 : 例外に、tcp/3306 port追加
(2) 環境変数設定 :
 [マイコンピュータ]-->[右クリック]-->[詳細設定タブ]-->[環境変数]-->[PATH] にインストールディレクトリを追加

---------------------------------------------------------------
3/11.my.iniの変更(文字コードをUTF-8に設定変更)
---------------------------------------------------------------
※ winにmysql単体でインストールすると、インストールディレクトリ直下に、my.iniで出来きてた。
※ xamppだと、インストールディレクトリに、my.cnfで出来きてたが今回はxamppは使わない。
※ mysqlの初期文字コードは、ほぼ"latin1"になっているので、PHPで色々データ操作する場合、UTF-8の方が後々面倒が無いのでUTF-8に変更する。
※ 修正後は、mysqlプロセスを[コンパネ]->[管理ツール]->[サービス]で再起動。
※ UTF-8用変更箇所(以下、無かったら書き足し)

[client]
default-character-set=utf8

[mysql]
default-character-set=utf8

[mysqld]
skip-character-set-client-handshake
default-character-set=utf8
character_set_server=utf8

init_connect='SET autocommit=0'
※Auto Commitを無効にする場合記述。あんまりやらない。

----------------------------
4/11.Loginあれこれ
----------------------------
(1) DB指定無し mysql -u root -psecret123 -s -N -b
(2) DB指定有り mysql -u root -psecret123 -s -N -b db_name

 ※ PW指定時は、引数"-p"と、パスワード自体の文字列は、続けて書く。半角空白等は空けない。
 ※ login時のオプションは、Dosプロンプトで、mysql --helpで確認出来る。
 ※ お気に入りオプション
  (a) -b, --no-beep : Turn off beep on error.
  (b) -N, --skip-column-names : Don't write column names in results. WARNING: -N is deprecated, use long version of this options instead.
  (c) -s, --silent : Be more silent. Print results with a tab as separator,each row on new line.

----------------------------
5/11.文字コード確認他
----------------------------
(1) 文字コード確認 mysql> show variables like 'char%';
 ※ これで、latain1とか出てると、後々面倒なので、utf8に、変更しておく("3"参照)

(2) 文字コード設定 mysql> set names utf8;
 ※ どうしてもShift_JISが、(・∀・)イイ、ナンギな人は、mysql> set names cp932;

----------------------------
6/11.DB作成
----------------------------
(1) DB作成 mysql> Create Database db_name CHARACTER SET utf8;
(2) DB切り替え mysql> use db_name2;

----------------------------
7/11.ユーザへの権限付与あれこれ(rootで付与)
----------------------------
(1) 全権限付与パターン
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'localhost' IDENTIFIED BY 'secret123';
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'127.0.0.1' IDENTIFIED BY 'secret123';
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'192.168.0.2' IDENTIFIED BY 'secret123';
mysql> GRANT ALL PRIVILEGES ON *.* TO root@'pcname.domain.jp' IDENTIFIED BY 'secret123';

(2) SELECT権限付与パターン
mysql> GRANT SELECT ON db_name.* TO msadmin@'192.168.0.2' IDENTIFIED BY 'secret123';
mysql> GRANT SELECT ON db_name.* TO msadmin@'svname.domain.jp' IDENTIFIED BY 'secret123';

----------------------------
8/11.Table作成/削除/テーブル項目確認
----------------------------
(1) Table作成
mysql> create table tb_01 (01_char char(4),01_num integer,01_vchar varchar(255),01_text text,01_datetime datetime,01_date date,01_time time,01_blob blob,01_MEDIUMBLOB MEDIUMBLOB,01_longblob longblob) type=InnoDB CHARACTER SET utf8;

 ※ テストなので、取り合えず、よく使いそうな型を作っとく。

 char : 固定長で短めの値に使う
 varchar : 長さ制限つき可変長で長めの値に使う ※255byteまで
 text : 長さ制限なし可変長項目。マニュアルによると”最良の選択”らしい
 integer : 通常使用する整数 -2147483648 から +2147483647"
 date : yyyymmdd
 time : hh:mm:ss
 datetime : yyyymmdd hh:mm:ss
 blob : 小さいバイナリデータ
 mediumblob : blobより大きめなバイナリデータ
 longblob : mediumblobより大きめなバイナリデータ(笑。マニュアルで制限バイト数は調べる前提)

(2) Table削除 mysql> drop table tb_01;

(3) Table項目確認 mysql> desc tb_01;

----------------------------
9/11.SQL
----------------------------
(1) mysqlは、デフォルトだとAUTO COMMIT。ORACLEから転向すると、先ずコレがタルい。
   慣れた方がいいと思うが、以下クセにしてもイイかもしれないし、my.iniで何とかなる様ならしてもいいかもしれない。ただ、PHPなんかだと、"mysqli::autocommit"なんかで制御できるし、「CGIはロールバックしなきゃいけない様な間違いは起こさないし、ロールバックする処理を画面機能として利用出来る様にするには、それ専用の機能を考える」前提なので余り気にしてない(運用JOBを当初考えてなかったものを運用していたり、手テストの時タルいだけ。それは開発者の責任だと思うんスよ)。

  (a) AUTOCOMMITの解除パターン1(COMMITしない場合、EXITした時に、更新無効)
   mysql> SET AUTOCOMMIT=0;

  (b) AUTOCOMMITの解除パターン2(COMMITしない場合、EXITした時に、更新有効)
   mysql> begin

  (c) ROLLBACK用セーブポイントの作成(ver4.14以上)
   mysql> SAVEPOINT セーブポイント名

  (d) セーブポイント迄ロールバックする。
   mysql> ROLLBACK TO SAVEPOINT セーブポイント名

  (e) データトランザクションの確定
   mysql> commit;

(2) UPDATE myssql> update tb_02 set 02_vchar = 'データの中身は日本語だ' where 01_char = '0001';
(3) DELETE myssql> delete from tb_01;

 ※ INSERT文を打つのははタルいので、以下LOADコマンドを使用(Blobは、別途PHPでINSERT CGIを作成した方が後々のテストがラクチンなので、CSVインサート時は空白のまま)

----------------------------
10/11.デリミタ付きデータ入力
----------------------------
 (1) テストデータ例
  ・ utf8でDB設定している場合は、ファイルの中身のデータも、BOM無UTF-8で作成する。
  ・ mysqlのバージョンによって、日付の"-"、":"の要不要があるらしい。

1001,1,1件目。日本語使います,http://www.yahoo.com/,2005-04-08 23:59:59,2005-03-08,23:59:59,0,,,

 (2) LOADコマンド(ファイル単位でデータ入力)
mysql> LOAD DATA INFILE "C:/temp/mysqldata/tb_01utf8.dat" INTO TABLE tb_01 FIELDS TERMINATED BY ',';


【覚書】blobをDBに突っ込む超適当なPHP
$upfile_name_w1 = basename($_FILES['userfile']['name']);
$wk_vchar = $upfile_name_w1;
$wk_text = $_FILES['userfile']['type'];
$wk_size = $_FILES['userfile']['size'];
$uploaddir = 'C:\temp\up\';
$upfile_name_w2 = mb_convert_encoding($upfile_name_w1,"SJIS","auto");
$uploadfile = $uploaddir . $upfile_name_w2;
$wk_longblob_w1 = file_get_contents($uploadfile);

※ 以下の前にMysqlには繋げておく
$wk_longblob = mysql_real_escape_string($wk_longblob_w1);

※ 後は適当にINSERT文を作る。この際、Blobを表示する場合のヘッダ情報として、file type、ファイル容量、Blobにテキストデータを突っ込んだ際の文字コードなんかを入れとく。
 テキストデータかどうかは拡張子で判断、あと文字コードはわかんないんでテキストデータだったら特定の文字コード固定で突っ込む仕様で周囲を納得させとくのが面倒ない。先に言っちゃう。「実際100%保障対象外なんすよ」って。
 また、Blobに突っ込む場合、php.iniの、"upload_max_filesize"デフォルトだとエラーになるので、予めアップロードするファイル容量に限界がある事も先に言っとくのが面倒なくていい。10MB迄ですとかね。勿論、フォルダ権限とかも注意しとく。
※ ファイルアップロード時のエラーはココで確認して、適宜エラー処理する。

----------------------------
11/11.家なので音楽聴きながらダラダラやれる
----------------------------
実は好きだったおっさんロックな、Dave Mattews BandのFirstアルバム。Under the Table and Dreaming。SAXとバイオリン、ドラムが強力。白人ボーカルなんだが南アフリカ出身。曲から漂ってくるのは、何処と無くアフリカの大地だったり、ヨーロッパの民族音楽っぽかったりする。でもロック。不思議なサウンドだね。まぁ一度位は聞いておいても損は無い。これを2回位回せば、mysql環境の出来上がり!となります。んん~・・・いぃねぇ。