MySQL@Centos5の設定メモ

MySQLのインストールメモ。
さてさてMySQLはOracle傘下に入ってどうなるんでしょうかね。

参考サイト
データベースサーバー構築(MySQL) - CentOSで自宅サーバー構築

とりあえずインストール。
# yum -y install mysql-server



次に設定ファイルの編集。
# vi /etc/my.cnf

default-character-set = utf8

[mysql]
default-character-set = utf8

[mysql]とはなんぞやと思って調べてみたら、公式サイトで。
MySQL :: MySQL 5.1 リファレンスマニュアル :: 3.3.2 オプションファイルの使用
[mysqld]および[mysql]グループは、mysqldサーバおよびmysqlクライアントプログラムにそれぞれ当てはまります。
[client]オプショングループは、すべてのクライアントプログラム(mysqldは除く)によって解読されます。これによって全てのクライアントに当てはまるオプションを指定することが可能になります。

らしい。
これを読む限り[cliant]でも良さそうだけどね。
ちゃんと知りたかったら、一冊本でも読まないかんなこれ。


んで、起動&自動起動の設定も。
# /etc/rc.d/init.d/mysqld start
# chkconfig mysqld on



インストール完了。
次にMySQLの設定にはいる。
# mysql -u root

mysql> select user,host,password from mysql.user;

mysql> set password for root@localhost=password('パスワード');
mysql> set password for root@'longkey1.net'=password('パスワード');
mysql> set password for root@127.0.0.1=password('パスワード');

mysql> select user,host,password from mysql.user;

mysql> show databases;
mysql> drop database test;

mysql> grant all privileges on データベース名.* to ユーザー名@localhost identified by 'パスワード';
mysql> select user from mysql.user where user='ユーザー名';
mysql> flush privileges
mysql> exit

# mysql -uユーザー名 -pパスワード

mysql> create database データベース名
mysql> show databases;
mysql> use データベース名
Database changed

ざーっと書いたけど、大したことはしていない。

1.rootの皆さんのパスワードを設定
2.最初からあるデータベースtestを削除
3.新しく権限を持ったユーザーを作成
4.そのユーザーでデータベースを作成

データベースまでは作って、テーブルとかはphpMyAdminとかで作って良いと思う。

ちゃんとやろうと思ったら、管理者用のユーザーと一般用のユーザーとか作ったりして、使えるコマンドを制限して利用した方が良いと思う。
なにかセキュリティホールがあっても、それである程度防げると思うし。
まあ、ある程度の規模じゃなければやらないかもなあ。
データベース.テーブル名をコンマ区切りで複数指定出来るみたい。
この辺は細かくやろうと思えば、いくらでも出来るな、うむ。
カラムレベルまで出来るとなると、うむむ。
そこまでかっちりやるシステム作ることないだろうけどなー。

ということで、ざっくりこんなもんでどうでしょうかね。

MySQL&ADOdbのを使う時にExecuteではまる

ADOdbでExecuteを使う時に、?を使って値を変換してSQLを実行してくれるっていう使い方がある。
$conn->Execute("SELECT * FROM TABLE WHERE COND=?", array($val));

みたいな。

で、自分はテーブル名も入れたかったので、こうやった。
$conn->Execute("SELECT * FROM ? WHERE COND=?", array($table, $val));

まあ、テーブル名を追加しただけなんだけど、これが上手く動かない。
エラーメッセージには文法的に違うとしか出てこなくて、途方にくれた。

みんな、出来ているようなのになぜ?ということで、休みの日を使って調べてみた。
で、結局分かったのが、こんなSQLを発行されていた。
"SELECT * FROM 'tablename' WHERE COND='1'";

ここで、tablenameを"'"で囲っていることが気になり、それを外してみるとビンゴ!

以前、ADOdbを調べた時にデータベースのソフトによって、何で囲うかは判別していたような気がしたので、今回はもっと深いところまで追ってみた。
まず囲う文字のことを「識別子引用符文字」ということ。
なげえ。

で、一応qstr()って囲ってくれる関数はあるんだけど、それはMySQL独自の文字で囲うってよりもカラムの値を囲む為のもので、テーブル名とかまでは考慮していない模様。
テーブル名とかそういうのは、nameQuoteって値に入っているみたいだけど、それで囲ってくれるような関数は用意されていないっぽい。
(内部ではあるみたいだけど、外からは参照できなかったかな)

なんで直接その値を参照すれば良い。

まあ、見栄えは悪いけど様はこういうことだ。
$conn->Execute(
    "SELECT * FROM ".$conn->nameQuote.$tablename.$conn->nameQuote.
    " WHERE ".$conn->nameQuote."COND".$conn->nameQuote."=?", array($val));


ちなみにEthnaのEthna_DB_ADOdbクラスでは、quoteIdentifier()って関数が用意されているので、楽チン。
$this->db->query(
    "SELECT * FROM ".$this->db->quoteIdentifier($tablename).
    " WHERE ".$this->db->quoteIdentifier('COND')."=?", array($val));


自分の気づく遅さが嫌になる&またまた勉強になった。
Ethnaすげえ。

SET NAMES `SJIS`は禁止らしいよ

SET NAMESは禁止
特にここのコメント欄が熱いですよ、非常に勉強になりました。

誰かそういう情報を僕にくださいよー!もういろいろやっちゃったよ・・・。
ということで、今頃いろいろ気がついたのでメモ。

■PHP5.2.3以降の場合
mysql_set_charset()を使いましょう。

■PHP5.2.3以前の場合
SET NAMESを使うならUTF-8かUJISにしましょう

です。
知らなかったけど、UTF-8かUJIS使っていたので良かったかしら。

っつうか、日本語の文字コード一つに統一してください。
UTF-8な流れなんだから、それで統一してくれ。
頼む。

MySQL3.x.xだってEthna_AppObjectを使いたい場合

EthnaのEthna_AppObjectクラスはなかなか癖はありますが、ちょろっとした小規模のシステムの場合重宝する。
やっぱ楽なので。
古い環境(MySQL3.23.xとか)の場合、ちょっとばかり面倒な箇所があるので、こんなケースレアかもしれないけど、僕にはまだまだ必要なので晒しておく。

MySQLの3と4ではLIMIT/OFFSET句の書き方が違い、そこでこける。

ということで、Ethna_AppObject又はオーバーライドしたクラスの_getSQL_SearchProp()って関数を修正。
 // LIMIT, OFFSET
 $limit = "";

-if (is_null($count) == false) {
-    $limit = sprintf("LIMIT %d", $count);
-    if (is_null($offset) == false) {
-        $limit .= sprintf(" OFFSET %d", $offset);
-    }
-}

+if (is_null($count) == false) {
+    // mysqlの4.0.0未満かどうかのチェック
+    if (
+        ($this->db->type == "mysql") &&
+        (version_compare(
+               preg_replace('|[^0-9\.]|', '', @mysql_get_server_info()),
+               '4.0.0',
+               '<')
+        )
+    // mysqlの4.0.0未満の場合
+    ) {
+        if (is_null($offset) == false) {
+                $limit = sprintf("LIMIT %d", $offset).sprintf(", %d", $count);
+        } else {
+                $limit = "LIMIT 0".sprintf(", %d", $count);
+        }
+    // それ以外の場合(デフォルトのソースのまま)
+    } else {
+        $limit = sprintf("LIMIT %d", $count);
+        if (is_null($offset) == false) {
+            $limit .= sprintf(" OFFSET %d", $offset);
+        }
+    }
+}


MySQL以外のDBの時のは検証してないけど、多分いけるはず。
まー、新規で開発する場合はいらないけどね。

version_compare()とmysql_get_server_info()なんて関数があることにびっくり。
勉強になった。

#06 Apache&PHPをインストール - WinでPHPの開発環境を揃える

さて、いよいよApacheインストールするぞー。

例に漏れずsatarokさんの以下のエントリを参考に。
#08 Apacheのインストール・設定::VMWare×CentOS5 Windowsでカンタン開発環境 - GRANADA Hatena @ sotarok
#10 PHPのインストール・設定::VMWare×CentOS5 Windowsでカンタン開発環境 - GRANADA Hatena @ sotarok

そのままやったけど、
http://IPアドレス/
で見えない・・・。

いろいろ調べてた結果、SElinuxとiptablesが仇になっていた模様。
はじめての自宅サーバ構築 Fedora/CentOS - セキュリティが仇となる?

ちゃんと無効にしたら動いたー。

あと、やっぱどうしても時間のズレが気になる。
ntpサーバ立ち上げたんだけど、ちゃんと動いているようには見えん・・・。
っつうことで、cronで強引に・・・。

/etc/cron.d/ntpdate

0,10,20,30,40,50 * * * * root /usr/sbin/ntpdate ntp.tut.ac.jp > /dev/null


今日はここまで。
でもまあ、こういうことを試行錯誤していると、勉強にはなるわなー。
1 | 2 | 3 次のページ ≫ 1 of 3

アーカイブ

2010

  • 01
  • 02
  • 03
  • 04
  • 05
  • 06
  • 07
  • 08
  • 09
  • 10
  • 11
  • 12

2009

2008

2007

コンタクト

longkey1[at]gmail[dot]com