ラベル MySQL の投稿を表示しています。 すべての投稿を表示
ラベル MySQL の投稿を表示しています。 すべての投稿を表示

2014年11月17日月曜日

PDO: 接続するDBの指定

PDO では DSN(Data Source Name) で接続先の DB を指定する。
http://php.net/manual/ja/pdo.construct.php

MySQL の場合の DSN は
mysql:ホスト名;ポート;DB名;文字コード

のようになる。
詳細はこちら
http://php.net/manual/ja/ref.pdo-mysql.connection.php


その他、対応しているDBはこちら
http://php.net/manual/ja/pdo.drivers.php

2014年11月15日土曜日

PDO: テーブルから 1 つのカラムを配列で取得

fetchAll() に PDO::FETCH_COLUMN を渡すと、
1つのカラムを配列にして返してくれる。

function get_names() {
    $pdo = new PDO($dsn, $config['dbuser'], $config['dbpass']);
    $sth = $pdo->preapre('SELECT `name` FROM `my_table`');
    if(!$sth->execute()) {
        return false;
    }
    return $sth->fetchAll(PDO::FETCH_COLUMN);
}

get_names(); // ['tanaka', 'satou', 'suzuki', ...]

2014年7月25日金曜日

SQL: ORDER BY で複数指定

ORDER BY で並び替えを行なう時、
複数の列を指定して優先順位を付けることができます。
「まずカラムAで並び替え、カラムAが同じものはカラムBで並び替え」
というようにカラムA→カラムBという優先順位で並び替える場合は以下のようにかけます。
SELECT * FROM my_table ORDER BY column_A, column_B

商品データベースの中から、商品の幅の小さい順で取得、
幅同じ場合は高さの小さい順で取得といったことができます。

2014年7月5日土曜日

PDO のエラーコード 00000 の意味は?

PHP の PDO を使って SQL を実行したあと、
errorInfo() を見てみるとエラーコードに 00000 がセットされている場合があった。

array (size=3)
  0 => string '00000' (length=5)
  1 => null
  2 => null

エラーコード 00000 は SQL の実行が成功した時にセットされている。

2014年5月20日火曜日

MySQL で default-character-set が使えない場合

PHP + MySQL をインストール後、
UTF-8 で統一するために MySQL の設定を変更したところ、
再起動に失敗する現象が発生しました。
[mysqld]
default-character-set=utf8

どうやら MySQL 5.5 からオプションの名前が変わったようで、
character-set-server を使用しなければならないようでした。
以下のように変更して再起動に成功しました。
[mysqld]
character-set-server=utf8

参考
MySQL 5.5 で「default-character-set」が使えず文字化けする→「character-set-server」にするとOK - KennyQi
http://kennyqi.com/archives/334.html

2014年4月25日金曜日

PHP: PDOでMySQLから取得した文字列が ASCII で文字化けする対処法

さくらのレンタルサーバ上で PHP の PDO で MySQL へアクセスした際に、
取得できたデータの文字コードが ASCII になってしまう問題がありました。

色々と対処法を悩んだんですが、
PDO オブジェクトを作成した際に SET NAMES を実行する方法に落ち着きました。

PHP PDO: charset, set names? - Stack Overflow
http://stackoverflow.com/questions/4361459/php-pdo-charset-set-names

PDO を作成する関数(get_pdo()など)を作成しておいて、
そこで UTF-8 を指定するようにして必ず UTF-8 で取得できるようにしました。

2014年4月11日金曜日

MySQL:予約語と同じテーブル名はバッククォートで囲む

MySQL でテーブル名やカラム名が MySQL の予約語と同じ場合、
そのまま書くとエラーとなって実行することができない。

例えば group という名前のテーブルからデータを読み出す場合、
そのまま書くと文法エラーになる。
SELECT * FROM group;

You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'grom group' at line 1 

MySQL の予約語ではなく識別子であることを示す場合は
`` で囲む必要がある。
SELECT * FROM `group`;

テーブル名やカラム名には予約事被らないようにプリフィックスを付加するか、
識別子は全て `` で囲むようにすれば回避できる。

2014年3月16日日曜日

PHP: PHP 5.2 の PDO から MySQL へ接続できない

サーバの都合上、サポートが終了している古い PHP を使わなければならない場合があります。

Apache モジュールとして PHP 5.5 を使用していたサーバへ、
CGI モードで PHP 5.2 をインストールして使用したところ、
PHP 5.2 から PDO を使って MySQL へアクセス出来ないエラーが出ました。
Fatal error: Uncaught exception 'PDOException' with message 'could not find driver' in ...

PHP 5.2 で phpinfo() してみると、
PDO の欄に MySQL が存在していませんでした。



PHP 5.2 をソースからインストールするときに、
configure で --with-pdo-mysql を付けないといけませんでした。
再度インストールしなおしたところ、
PDO で MySQL へアクセスできるようになりました。

こちらの記事が参考になりました。

さくらでPDOを使ってMYSQLを使う - わっふるわっふる
http://d.hatena.ne.jp/rnamiki/20080315/1205556755

2014年1月7日火曜日

MySQL の文字コードを UTF-8 に統一する

WordPress プラグインから MySQL へ日本語を書き込もうとした際に以下のようなエラーが出現。

WordPress database error: [Incorrect string value: '\xE3\x82\xAD\xE3\x83\xBC...' for column ...]

原因は MySQL の文字コードが一部 latin1 となっていたため。

まず、MySQL の設定ファイルでデフォルトの文字コードを UTF-8 に設定する。
Cent OS の場合、
# vi /etc/my.cnf
[mysqld]
character-set-server = utf8

既に設定されている文字コードも変更。
# mysql -u root -p
[パスワード]

mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | latin1                     |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | latin1                     |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> set character_set_database = utf8;
mysql> set character_set_server = utf8;
mysql> show variables like 'character%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | binary                     |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

mysql> quit;


以上で日本語でも書き込めるようになった。

2013年12月23日月曜日

Cent OS 6 に yum を使って MySQL 5.6 をインストール

2013年12月23日の時点で MySQL Server Community Edition の最新バージョンは 5.6 です。5.7 は評価版が公開されている状態です。

MySQL では公式に yum のリポジトリを公開しており、Linux から最新版をダウンロードできるようになっています。

2.5.1. Installing MySQL on Linux Using the MySQL Yum Repository
http://dev.mysql.com/doc/refman/5.6/en/linux-installation-yum-repo.html

Cent OS 6 へ最新版の MySQL をインストールするには以下のように操作します。

---

まず、MySQL のサイトから rpm をダウンロードします。
http://dev.mysql.com/downloads/repo/

Cent OS 6 の場合は Red Hat Enterprise Linux 6 を選んで下さい。
ダウンロードできたらサーバ上にアップロードしておきます。

rpm パッケージをインストールします。
# rpm -i mysql-community-release-el6-5.noarch.rpm

既に MySQL の古いバージョンがインストールされている場合はアップデートします。
# yum update mysql-server

新規にインストールする場合は以下のように実行します。
# yum install mysql-server

これで最新版の MySQL 5.6 がインストールされます。
# mysql --version
mysql  Ver 14.14 Distrib 5.6.15, for Linux (x86_64) using  EditLine wrapper

2013年12月12日木曜日

MySQL の root パスワードをリセットする

MySQL をインストールした直後や、MySQL の root パスワードを忘れた時は root 権限で以下のコマンドで再設定できます。
$ mysqladmin -u root passwd

2013年11月29日金曜日

mysql.sock がない場合

ERROR 2002 (HY000): Can't connect to local MySQL server through socket '/var/lib/mysql/mysql.sock'

MySQL をインストール、ローカルでログインしようとしたら上のエラーが出た。
あれ?と思って調べてみたら mysqld を起動していなかったという落ちだった。
起動しないと生成されないらしい。

また、OS によっては /tmp/mysql.sock においてあることもある。

2013年11月22日金曜日

phpMyAdmin でセルをダブルクリックして編集する

MySQL の操作を GUI 上で行えるソフト phpMyAdmin ではセルをダブルクリックすることですぐに内容を編集できます。
今までこの操作を知らずに毎回編集ボタンを押していたので驚きました。

編集したいセルをダブルクリック

その場で編集できる
ちなみにバージョン 4.0.9 で確認しています。