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

2010年11月2日火曜日

SQL の相関サブクエリ (4) - SELECT 句で使う

SQL の相関サブクエリ (3) - 量化された比較述語 ALL, ANY」 のつづき

これまでは WHERE 句において相関サブクエリを利用する例を見た。今回は SELECT 句で使う。

前回と同じデータベースを対象にして

例えば、

性別ごとに年齢の順位

を求めたい。

 

SELECT 句で相関サブクエリ

… とは言ったものの、いきなり書こうと思っても頭が混乱するのでゆっくりと。

まずは、「人」の属性に 「全体の人数」 を加えた結果を取得する。

select *, 
       (select count(*) 
        from persons) as num
from persons as p1

結果は、

+----+---------+--------+-----+------+
| id | name    | gender | age | num  |
+----+---------+--------+-----+------+
|  1 | Tarou   |      1 |  10 |    7 |
|  2 | Hanako  |      2 |  20 |    7 |
|  3 | Jirou   |      1 |  30 |    7 |
|  4 | Saburou |      1 |  40 |    7 |
|  5 | Akemi   |      2 |   8 |    7 |
|  6 | Sadayo  |      2 |  70 |    7 |
|  7 | Hiroko  |      2 |  15 |    7 |
+----+---------+--------+-----+------+
7 rows in set (0.00 sec)

次に、性別ごとに人数のトータルを求めるため、相関サブクエリを使う。

方法は、

  1. 各々の 「人」 ごとにその性別を同じくする集合を求め
  2. その要素数を得る。

頭に思い浮かべたのは下図。

111-02-2010CropperCapture[1]

select *, 
       (select count(*) 
        from persons as p2
        where p2.gender = p1.gender) as num
from persons as p1

結果は、

+----+---------+--------+-----+------+
| id | name    | gender | age | num  |
+----+---------+--------+-----+------+
|  1 | Tarou   |      1 |  10 |    3 |
|  2 | Hanako  |      2 |  20 |    4 |
|  3 | Jirou   |      1 |  30 |    3 |
|  4 | Saburou |      1 |  40 |    3 |
|  5 | Akemi   |      2 |   8 |    4 |
|  6 | Sadayo  |      2 |  70 |    4 |
|  7 | Hiroko  |      2 |  15 |    4 |
+----+---------+--------+-----+------+
7 rows in set (0.00 sec)

最後に、順位を求めるために各々の 「人」 要素において、

  • 自分の年齢よりも小さい人の人数をカウントして 1 を足す

ついでなので性別ごとに昇順に表示。

select *, 
       (select count(*) + 1
        from persons as p2
        where p2.gender = p1.gender and
              p2.age    < p1.age) as rank
from persons as p1
order by gender, age

結果は、

+----+---------+--------+-----+------+
| id | name    | gender | age | rank |
+----+---------+--------+-----+------+
|  1 | Tarou   |      1 |  10 |    1 |
|  3 | Jirou   |      1 |  30 |    2 |
|  4 | Saburou |      1 |  40 |    3 |
|  5 | Akemi   |      2 |   8 |    1 |
|  7 | Hiroko  |      2 |  15 |    2 |
|  2 | Hanako  |      2 |  20 |    3 |
|  6 | Sadayo  |      2 |  70 |    4 |
+----+---------+--------+-----+------+
7 rows in set (0.00 sec)

 

Haskell で書く

Haskell で類似したコード書いてみる。

順に考えるなら、最初は全体の人数を結果に追加。

[(p1, length [p2 | p2 <- persons]) | p1 <- persons]

次に、性別ごとに人数のトータルを追加。

[(p1, length [p2 | p2 <- persons
                 , gender p2 == gender p1]) | p1 <- persons]

最後に順位を求める。

[(p1, 1 + length [p2 | p2 <- persons      
                     , gender p2 == gender p1
                     , age p2 < age p1]) | p1 <- persons]

( cf. gist: 645292 – GitHub )

SQL の相関サブクエリ (5) – forall (∀) の exists (∃) への読み替え」へつづく

2010年10月30日土曜日

MySQL でデータベースのエクスポートとインポート

1. データをコピーしたい

MySQL のデータを別の PC 上にコピーしたい。ただし、データベース名は変更する。

例えば、データベース hoge を piyo にインポートする。

 

2. データのエクスポート

コマンドラインより、データをファイル dump_hoge.sql へエクスポート。

mysqldump -u root hoge > dump_hoge.sql

生成されたファイルの中身を見ると、スキーマ名で修飾されていない SQL 文が記述されている。

 

3. データのインポート

インポート先で MySQL に接続。

mysql -u root

スキーマ piyo を作成。

create schema piyo;

エクスポートした dump_hoge.sql をインポート。

mysql -u root piyo < dump_hoge.sql

 

参考サイト

2010年10月19日火曜日

コマンドラインで mysql を操作

コマンドラインを起動。XAMPP を利用している場合、XAMPP がインストールされているディレクトリ/mysql/bin に移動して

mysql -u root

により MySQL に接続。

次の操作を行う。

  1. スキーマ (データベース) の作成
  2. テーブルの定義
  3. テーブルの変更
  4. テーブルのカラムの確認

12.1.10 CREATE DATABASE Syntax によりスキーマの作成。

create schema hoge;

12.1.17 CREATE TABLE Syntax によりテーブルの定義。

create table hoge.persons (id int primary key);

12.1.7 ALTER TABLE Syntax によりテーブルの変更。

alter table hoge.persons add column (name varchar(45) not null, age int not null);

12.4.5.6 SHOW COLUMNS Syntax により、定義したテーブルのカラム情報を表示。

show columns from hoge.persons

実行すると以下の結果が表示される。

+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |  
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | NO   | PRI | NULL    |       |  
| name  | varchar(45) | NO   |     | NULL    |       |
| age   | int(11)     | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

MySQL のテーブル定義とデータを SQL 文で出力 - MySQL Workbench と A5:SQL Mk-2 を使って

MySQL で構築したデータベースのテーブル定義とデータを SQL 文として出力したい。

 

MySQL Workbench で CREATE TABLE 文を生成

CropperCapture[5] - 2

  1. MySQL Workbench の Home より、 Data Modeling > Create EER Model From Existing Database で ERD を生成。
  2. メニューより、File > Export > Forward Engineer SQL CREATE Script... により生成。

または、 SQL Development の SQL Editor を開き、左ペインの Object Browser に表示されている データベースの Tables を右クリック > Send to SQL Editor > Create Statement 。 

 

INSERT 文の生成

A5:SQL Mk-2
  1. A5:SQL Mk-2 でテーブルを開く。
  2. メニューより、テーブル > insert文エクスポート

CropperCapture[3] 

 

MySQL Workbench
  1. MySQL Workbench の Home より、SQL Development 。対象のテーブルのデータを表示させる。 (テーブルを右クリック > Edit Table Data)
  2. メニューより、Query > Export Results ...

CropperCapture[4] 

表示されたダイアログの File Format フィールドで `SQL INSERT statements' を選択。

しかし、テーブル名がだめだった。 (@_@; なんでだろう?

 

関連記事

MySQL Workbench で外部キーの設定

1. テーブル定義

MySQL Workbench で外部キーの設定をしたい。

例えば、「人」 を 「グループ」 に 「割当て」 るモデルで考える。

「人」 (persons) 「グループ」 (groups) に対応したテーブルが定義済みだとする。これに対して、「割当て」 (assignments) に対応したテーブルを作成し、外部キーを設定したい。

 

2. SQL Development で外部キーを設定する場合

MySQL Workbench の Home において SQL Development を選択し、connection でデータベースに接続。

CropperCapture[5]

SQL Editor が開いたら、左ペインの Object Browser に表示されている

  • データベースの Tables で右クリック > Create Table

MySQL には基盤となるデータベースエンジンが複数あり、この中で外部キーをサポートしているのが InnoDB

InnoDB - Wikipedia によると、

InnoDB(イノデービー)はMySQLのためのデータベースエンジンであり、MySQL ABが配布している全てのバイナリに標準搭載されている。MySQLと使用できる他のデータベースエンジンに対する改良点として、PostgreSQLに似たACID互換のトランザクションに対応していることがある。また、外部キーもサポートしている。(これを宣言的参照整合性という)

よって、「Table タブ」 における Engine の選択で InnoDB を選択。

CropperCapture[6]

「Columns タブ」 でカラムの設定をしたら、「Foreign Keys タブ」 で外部キーの設定は行わなわず、Apply ボタンを押して一旦テーブルを作成。

テーブルを作成した後、テーブルを変更する。

  • 右クリック > Alter Table

「Foreign Keys タブ」 で外部キーを設定する。

  1. Foreign Key Name は適当に付ける。
  2. Referenced Table は スキーマ名.テーブル名 で指定。
  3. Column で外部キーを参照するためのカラムを指定。
  4. 参照先のテーブルのカラムを設定。

 

3. Data Modeling を使う場合

既にテーブルを定義している場合、MySQL Workbench の Home より

  • Data Modeling > Create EER Model From Existing Database

により、ERD を生成できる。

CropperCapture[5] - 2

テーブルのカラム定義が済んでいる場合は、Diagram の左下アイコン

  • Place a Relashinship Existing Columns

を選択し、参照するカラムを選択してから、参照先のカラムを選択する。これにより、外部キーを設定できる。

CropperCapture[2]

データベースに変更を反映するには、

  • メニューより Database > Synchronize Model ...

を選択。

 

4. リレーションシップの点線と実線

外部キーを設定するときの線の種類には、点線と実線がある。

点線が Non-Identifying Relationship で、実線が Identifying Relationship 。

この違いは、(7.7.2.1 Adding Foreign Key Relationships Using an EER Diagram によると、

An identifying relationship is one where the child table cannot be uniquely identified without its parent.

Identifying Relationship の方は、参照する側 (子) が存在するには、参照される側 (親) が存在する必要がある場合に使うようだ。

テーブルの定義としては、点線の方は、カラムに外部キーの制約付けられる。実線は、参照する側のカラムが主キーの一部となることが加わる。

2009年4月8日水曜日

Python で MySQL を操作 – MySQL-python

1. MySQL を Python で操作するためのライブラリ

Python で MySQL のデータを操作したい。

MySQL - PythonInfo Wiki によると、以下の 3 つのライブラリが挙げられていた。

とりあえず、一番上を使ってみよう。

 

2. MySQL for Python のダウンロードとインストール

をダウンロードしてインストール。

090407-003

\Lib\site-packages\ にインストールされる。

 

3. Python Database API Specification

MySQLdb User's Guide によると、

If you want to write applications which are portable across databases, use MySQLdb, and avoid using this module directly. _mysql provides an interface which mostly implements the MySQL C API.

_mysqlMySQLdb の二つのインターフェイスがある。データベース間で、統一したインターフェイスを持つことを目的にされた MySQLdb は、

を実装している。

Some examples を参考にしながら試すことにした。

 

4. 例

郵便番号のデータ を MySQL に登録してみる。

CSV ファイルのデータ形式は、郵便番号データファイルの形式等 を参考にした。このデータから、以下の項目を抽出する。

  • 郵便番号(7桁)
  • 都道府県名
  • 市区町村名
  • 町域名
方法

まずは、MySQL Administrator を使って、以下のような yuubinbangou テーブルを作成。

090407-004

コードを以下に示す。

  1. 最初にテーブルのデータを削除し、
  2. CSV ファイルから 100 件分のデータを登録した後、
  3. 登録したデータ 10 件分を表示するようにした。

(郵便番号のデータは C: 直下に配置。)

import MySQLdb, codecs

# DB に接続
db = MySQLdb.connect(user="test", passwd="test", db="test", charset="utf8")
# カーソルの取得
c = db.cursor()

# DELETE
c.execute("delete from yuubinbangou")

# INSERT (最初から 100 件分を登録)
FILE_PATH = ur"C:\KEN_ALL.CSV"
f = codecs.open(FILE_PATH, "r", "shift_jis")
for i in range(0,100):
    row = [x[1:-1] for x in f.readline().split(',')]
    c.execute(u"""INSERT INTO yuubinbangou(bangou, ken, si, tyou)
                VALUES ('%s', '%s', '%s', '%s')"""
                % (row[2], row[6], row[7], row[8]))
f.close()

# COMMIT
db.commit()

# SELECT
c.execute("SELECT * FROM yuubinbangou")
# 最初から 10 件を表示
it = iter(c)
for i in range(0,10):
    for col in it.next():
        print col,
    print

 

コードについて

データベースに接続する connect メソッドの引数に、

charset="utf8"

を追加しないと、UnicodeEncodeError が投げられた。

その他、以下を参照。

MySQL で文字化け - 後から文字コードを変えるとき」のようなミスをしないように。 (+_+)

2009年4月7日火曜日

MySQL で文字化け - 後から文字コードを変えるとき

my.ini の設定で (WinMySQLadmin の my.ini Setup タブ)

[mysqld]
default-character-set=utf8

を追加せずに MySQL Administrator でテーブルを作成したら、文字コードが latin1 となった。これに気がつかずデータを挿入したので文字化け。

 

これではいけないと思い Table OptionsCharacter Set を `utf8’ に変更。これにより新規に列を作った場合、列の Character Set は utf8 になる。

090407-002

 

しかし、変更前に作成した列は latin1 のままなので、Column Charset も utf8 に変更する必要がある。

090407-003

 

Access から MySQL にデータを追加すると文字化けするなぁと思ったら、こんなことが原因だったとは…。あぁ~、余計な時間を… (+_+)

 

関連記事

2009年4月1日水曜日

MySQL を GUI で操作するツール - テーブルの定義、ERD の確認、SQL の実行

1. 昔使っていた MySQL を操作するためのツール

XAMPP をインストールしたものの、長い間放置していた。久しぶりに MySQL をいじってみる。

全ての操作をコマンドラインで操作するのはきつい。そのため、MySQL Administrator でテーブルを作成し、SQL を実行する。しかし、最近 Access を触っていたので、お手軽・グラフィカルにテーブルを定義して外部キーを設定できないと面倒。 (+_+)

で紹介されいる、どのツールを利用するのがベストなのだろう?

昔、使っていたツールは、

  1. SQL を実行するときには Execute Query
  2. テーブルの全体構造を把握したいときは DbVisualizer

今では Execute Query も ERD を生成してくれる。ERD の表示に関しては DbVisualizer の方がお手軽みたい。

 

2. MySQL Workbench でテーブルの作成と ERD の生成

以前、 MySQL で使えるツールを調べたときは、DBDesigner 4 を利用しようと考えた。しかし、このツールの開発は停止している。

fabFORCE.net によると、

MySQL Workbench 5.0 has been developed by the Developer Tools Team of Sun Microsystems, Database Group. The team is lead by fabFORCE.net founder and DBDesigner4 implementor Michael G. Zinner, aiming to offer an improved database tooling experience for all platforms.

本家の MySQL Workbench は、DBDesigner4 を開発した人が関わっている。早速、MySQL Workbench Downloads よりダウンロードしてインストール。

Chapter 4. MySQL Workbench Tutorials を読みながら試行錯誤。

ただし、15 Reverse Engineering によると、

Reverse engineering using a MySQL DDL script applies to all versions of MySQL Workbench; reverse engineering a database directly from a MySQL server applies to commercial versions of MySQL Workbench only.

DDL を出力してくれるけれど、商用バージョンの MySQL でないとダイレクトに扱えないのが残念。(@_@;)

 

データモデリング

追記 (2010.10.3) : MySQL Workbench を使うと、グラフィカルにデータモデリングを行うことができる。(5.2.28 CE Revision 6722)

img10-03-20101

予めテスト用のデータベースを作成しておく。

  1. “SQL Development" の New Connection でデータベースに接続。
  2. テスト用のスキーマを作成。

設定できたら、

  1. “Data Modelling” の Create EER Model From Existing Database により、テスト用のデータベースの内容をリバースエンジニアリング。
  2. テーブルの内容を修正しては、メニューより 「Database > Synchronize Model…」で変更を反映させる。

img10-03-20103

 

3. ODBC 経由でデータベースにデータを挿入

上記 MySQL Workbench にはテーブルの内容を入力したり、修正するためのインターフェイスがある。( SQL Development > Edit Table Data )

img10-03-20101

しかし、表計算ソフトのデータをコピーして貼り付けるということはできないようだ。この目的のために他のツールを探すことに。

 

SQL で操作するためのツール

データベースを操作するためのツールの中で日本人が作成した有名所と言えば、

Vector の データベース の項目を見ても人気が高い。

 

ODBC の設定

試してみると両ツールとも ADO を使って DB にアクセスするようなので、予め ODBC の設定が必要。方法は 「ODBC によるMySQLの操作」 を参考にした。

方法は、

  1. ODBC で接続するためのコネクタを用意
  2. ODBC のリソースの設定

MySQL  本家サイトを見ると、DB に接続するためのコネクタがある。 JDBC のときは Connector/J ということか。(Execute Query, DbVisualizer  の場合)

リソースの設定は 「コントロールパネル > 管理ツール > データソース(ODBC) 」 で行う。

090401-005

 

文字化け対策

上記 ODBC の設定における Connector/ODBC (「システム DSN」の「構成」) の Connect Options の Initial Statement の値を

SET NAMES SJIS

として設定。

090401-006

MySQL を UTF-8 で使っている場合、この設定をしないと A5:SQL Mk-2 で日本語でデータを追加すると文字化けするようだ。Character Set は何も入力しなくても大丈夫だったけれど、念のため sjis を指定。

ただし、テーブルへのインポートを行うと文字化けする。理由はわからず。 (+_+)

MySQL の設定として、 WinMysqLadmin で my.ini Setup タブに 

[mysqld]

default-character-set = utf8

[ODBC]

default-character-set=sjis

を追加したけれどダメだった。

 

4. A5:SQL Mk-2 で表計算ソフトからデータのペースト

ODBC の設定ができたら、A5:SQL Mk-2 でデータベースへ接続するための設定をする。

  1. メニューより 「データベース > データベースの追加と削除…」を選択。
  2. ダイアログが表示されたら、「追加」ボタンを押す。
  3. 「プロバイダ」 タブで "Microsoft OLE DB Provider for ODBC Driver" が選択して「次へ」
  4. データソースを ODBC の設定でした名前を選択。

もし、接続テストをして以下のエラーが表示された場合は、

接続先データベースが不明です。MyODBCにて接続の場合は "Database" の項目を設定して下さい。

ODBC の設定において、Login > Database のフィールドに記述がされているか確認する。

img10-03-20102

表計算ソフト (Excel, OOCalc, Google SpreadSheet) でデータを作成しコピーしたら、A5:SQL Mk-2 でデータを挿入する対象のテーブルを開き、「編集 > レコード貼り付け(ExcelやTSVから)」 を選択。

ただし、OOCalc の場合、以下のエラーが表示されるので、「レコード貼り付け(ExcelやTSVから) 」ボタンを押す。

img10-03-20103

 

5. サンプルデータベースの作成とデータの取り込み

追記 (2010.10.9) : 例えば、「株式会社モンダ技研工業 販売管理データベース」のデータを MySQL に取り込みたい場合は、

  1. 予め MySQL Workbench でテーブルを定義
  2. 表計算ソフトにデータをペースト
  3. ODBC 経由でデータベースにアクセスできるように設定
  4. 表計算からデータをコピーして、A5:SQL Mk-2 でレコードを貼り付ける

ただし、上記データの日付は MySQL の Date 型に直接取り込めない。 OOCalc を利用しているなら、下記のように MySQL の日付リテラルで許可される形式に変換しておく必要がある。 ( cf. 10.3.1 DATETIME、DATE、そして TIMESTAMP タイプ)

=LEFT(日付;4) & "/" & MID(日付;5;2) & "/" & RIGHT(日付;2)

 

6. まとめ

 

参考

2008年12月3日水曜日

XAMPP を入れなおしたら、Apache, MySQL が起動しない

1. XAMPP をインストール

久しぶりに XAMPP を入れ直した。バージョンは 1.6.8。

 

2. Apache が起動しないのは、Skype が原因

XAMPP のコントロールパネルを使って、Apache が起動を試みた。しかし起動しない。

問題は、以前と同じように Skype が邪魔をしていた

Skype において、 ツール > 設定 > 詳細 > 接続 の「上記のポートの代わり、ポート80を使用」のチェックをはずした。

 

3. MySQL が起動しない

次に、MySQL を起動しようとしても起動せず。 (+_+)

次のようなエラーが表示された。

ローカルコンピュータのMySQLサービスを開始できません。エラー1067: プロセスの途中で強制終了しました。

WEB+DBプログラミングの基礎FAQ - [データベース]All About によると、

この問題が発生した場合は、winmysqladminを停止し、
C:\WINDOWSフォルダ内(*注1)にあるmy.iniファイルを削除します。

上記に従い、C:\WINDOWS\my.ini を削除。

次に、C:\xampp\mysql\bin\winmysqladmin.exe を起動。username と パスワードを設定するように促されるので設定。

しかし、今度もまたエラーが。 (@_@;)

Access violation at address XXXXXXX in module 'LIBMYSQL.dll'. Read of address 00000000.

以前にも同じエラーが表示されたことがある。。

WinMySQLadmin 1.4 を起動し、my.ini タブを選択。

`user= , password= ' に文字が記入されていたので、これを削除し、Save Modification ボタンを押した。

同じ対処をしたら、 MySQL が動いてくれた。

 

4. MySQL Administrator のインストール

追記 (2008.12.3) : お手軽に GUI から操作できる

をインストールした。ダウンロードするとき、ユーザ登録を促されるが、

を選択。

デフォルトでは以下の場所にインストールされる。

C:\Program Files\MySQL\MySQL Tools for 5.0\MySQLAdministrator.exe

しかし、MySQLAdministrator を起動しようと思ったけれど、root のパスワード忘れてもうた… (o_ _)o~†

 

root のパスワードを変更

の説明に従い、コマンドラインから、xampp の mysql フォルダにある C:\xampp\mysql\bin\ に移動してから、

mysqladmin -u root password パスワード

により、パスワードを変更。

これに伴い phpMyAdmin における設定も変更。

  • C:\xampp\phpMyAdmin\config.inc.php の root のパスワード

を設定した。

$cfg['Servers'][$i]['password']      = 'パスワード';

 

my.ini の指定

これで MySQLAdministrator を root 権限で起動できるかと思いきや、次のようなエラーメッセージが表示された。

Either the server service or the configuration file could not be found. Startup variables and service section are therefore disabled.

Beautiful Dreamer ~ ばしっ子ドットコム Returns ~::2008年02月 によると、

これは、単純に設定ファイルのパス指定の問題。
なので、レジストリ・エディタで簡単に対応。

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MySQL\ImagePath
C:\mysql\bin\mysqld.exe MySQL

"C:\mysql\bin\mysqld.exe" --defaults-file="C:\WINDOWS\MY.INI" MySQL

説明に従い、レジストリエディタ (regedit)で

C:/xampp/mysql/bin/mysqld-nt.exe --defaults-file="C:\WINDOWS\MY.INI" MySQL

上記で問題になっていた my.ini ファイルを指定するようだ。

mysqld.exe と mysqld-nt の違いはあったけれど、これは NT 系の OS の違いということなのかな。

あ~、これでやっと MySQLAdministrator が問題なく起動してくれた。 ^^

2008年4月29日火曜日

WinMySQLadmin を起動すると、エラー表示が繰り返される

1. MySQL をサービスとして起動すると、エラーダイアログが表示される

xampp-win32-1.6.6a インストールし、 MySQL をサービスとして起動したら、以下のようなエラーが繰り返しダイアログで表示された。

Access violation at address XXXXXXXX in module 'LIBMYSQL.dll'. Read of adress XXXXXXXX.

Image1

 

2. my.ini の user, password を削除してから、起動する

access violation at address 10002593 « Php bugs (via. Nix::WebLab: access violation at address 10002593 in module ‘LIBMYSQL.dll’ read at address 00000000.) によると、

Start > All Programs > Startup > WinMySQLadmin > Click on the my.ini Setup tab

Change the below default line at the bottom :
user=root
password=password

to

user=root
password=

WinMySQLadmin 1.4 を起動し、my.ini タブを選択。

`user= , password= ' に文字が記入されていたので、これを削除し、Save Modification ボタンを押した。

Image2

2007年3月25日日曜日

MySQLのパスワードを変更する

→ すぐに忘れる脳みそのためのメモ: Client does not support authentication protocol エラー
http://jutememo.blogspot.com/2007/01/client-does-not-support-authentication.html

2007年1月30日火曜日

MySQL と PHP の文字コード

PHPからMySQLに日本語を入れたら文字化けしてしまった。 データには、"?"が並んでいる。 MySQLは4.1.22。 PHPは、4.4.2。

MyNA Web Site によると、4.0と4.1には大きな違いがあるとのこと。

4.0 までは、キャラクターセットはサーバーだけが設定するものであり、クライアントがサーバーのキャラクターセットに自動的に合せて動作していました。 ところが4.1 になってから、サーバー、クライアントがそれぞれのキャラクターセットで動作するようになりました。

よくわからないけど、以下のコマンドによって、設定の状態を知ることができるらしい。

SHOW VARIABLES LIKE 'char%';

ここで表示される character_set_client と character_set_server が一致していれば、文字化けは起きないとのこと。 表示させてみたら、 character_set_server の値が latin1 になっていた。 おかしいと思って調べたら、インストール後の MySQL Server Instance Config Wizard の設定で、日本語を扱う設定をしていたのを忘れていた。 default character set を設定する画面で、Manual Selected Default Character Set / Collection を選び、Character Set を ujis にした。(ujis とは euc-jp のことらしい。)Windows の環境でも、これで問題はでないのだろうか?

これまで、MySQL Administrator 付属の MySQL Query Browser でデータを挿入しても、日本語が化けるわけだ。。。 付属のツールが何か調子が悪いのかと思って、Execute Query でも試したが文字化けしたので、なぜかと悩んでいた。 ばかみたい。。。(o_ _)o~†

そういえば、CMS系をインストールするときによくみた以下のエラーは、4.1によってパスワードの保存形式が変わったからだそうだ。

Client does not support authentication protocol requested by server;

さて、試しに、MySQL Server Instance Config Wizard で Best Support For Multilingualism に設定してみた。 この場合、PHP から日本語を挿入しようとしたら、以下の文が必要であった。

mysql_query("SET NAMES ujis");

しかし、MySQL Server Instance Config Wizard において、ujis に設定したら、上記の文は必要なかった。なんかややこしい。(+_+)

MySQL Query Browser でテーブルを一気に作成する

  1. テーブルを作成したいスキーマを選択する。
  2. 「File > Open Scritp」
  3. Executeボタンを押す。

MySQLに新規ユーザを追加する

  1. MySQL Administrator を利用する場合、"User Administration" において、追加したいユーザを作成する。
  2. カタログにおいて、新しいスキーマを作成する。
  3. "User Administration" において、新しく作ったスキーマに対して、権限を付与する。(Assigned Privilege)

MySQL のアンインストール

「コントロールパネル > プログラムの追加と削除」 では、インストールしたディレクトリまでは削除されないので、それも削除してやる必要がある。もし、削除せずに再インストールを行った場合、途中でエラーが出る。

Client does not support authentication protocol エラー

MySQL4.1 において、クライアントから接続できない場合、以下を参考にする。

MySQL AB :: MySQL 4.1 リファレンスマニュアル :: A.2.4 Client does not support authentication protocol エラー

mysql> UPDATE mysql.user SET Password = OLD_PASSWORD('mypass')
-> WHERE Host = 'some_host' AND User = 'some_user';
mysql> FLUSH PRIVILEGES;

上記の方法で、パスワードを変更することができる。

MySQLのインストール

MySQL4.1をダウンロードする。(MySQL AB :: MySQL 4.1 Downloads)
MySQLをGUIで操作するためのツールをダウンロードする。(MySQL AB :: MySQL GUI Tools Downloads)
MySQL Administrator を利用すると、ユーザやテーブルの作成を簡単にできる。