データベースの作成、文字列エンコーディング、DDLロードなどの初期作業
前回はデータベースユーザーを作成するところまで進めました。
今回は、
・データベースインスタンス作成
・テーブル作成(DDLファイルから)
・マスタデータロード(CSVファイルをロード)
を目標にやっていきたいと思います!
データベースインスタンス作成
データベース所有者となるユーザーでmysqlに接続して、
CREATE DATABASE database_name CHARACTER SET utf8;
を実行します。
$ mysql -u pizza -p Enter password: MariaDB [(none)]> CREATE DATABASE pizzadb CHARACTER SET utf8;
※私は上記のようにDBを作成して以降の作業を進めましたが、サーバーのデフォルトエンコーディングをUTF-8にするには、COLLATE utf8_general_ciも同時に指定した方が良さそうです。(後述)
テーブル作成
DDLファイルからテーブルを作成するには、mysqlコマンドを実行するときに、データベース名を指定した上で、標準入力にDDLファイル名を指定すれば良いようです。
mysql database_name -u user_name -p < ddl_file_path
$ mysql pizzadb -u pizza -p < ddl.sql
その都度調べながらやりましたが、ここまでは特に問題なく進められました。
CSVデータをロードする
さて、これまで、DB作成時と、テーブル作成時にUTF-8を指定してきました。*1
しかし、MariaDBには(MySQLにも)多くの、細かなエンコード指定があるみたいです。
具体的に調べてみると、ざっとこんだけありました。
MariaDB [(none)]> 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 | /opt/mariadb-5.5.31/share/charsets/ | +--------------------------+-------------------------------------+
上記は設定を終えた後に表示したものなので、必要なエンコードはすべてUTF-8になっていますが、ここまでの作業をしただけでは、いくつかlatin1のものがありました。どうやら、ざっくり言って、サーバー側とクライアント側のエンコードをそれぞれ設定してやる必要がありそうです。
サーバーのエンコードを設定する
サーバー側のデフォルトの文字列エンコードはデータディレクトリ内の、データベース名ディレクトリ内の、db.optファイルに設定されているそうです。例えば、私の環境では、
・データディレクトリ:/var/mariadb/data
・データベース名:pizzadb
なので、
/var/mariadb/data/pizzadb/db.opt
というファイルになります。
このファイル内に、以下の設定をしてやれば良さそうです。
default-character-set=utf8 default-collation=utf8_general_ci
そして、これは後から気づいたことですが、CREATE DATABASEをするときに、
CHARACTER SET utf8
だけでなく、
COLLATE utf8_general_ci
も一緒に設定してやれば、db.optに自動的に上記設定がされていたのではないか、という気がします。実際には試していないのですが、マニュアルにはそう書いてますので、恐らく間違いないかと。
http://dev.mysql.com/doc/refman/5.1/ja/create-database.html
(5.1ですが。)
クライアント(localhost)のエンコードを設定する
さて、クライアントの文字列エンコードも指定してみます。
少し面倒な事情がありまして、私の場合、サーバー用のmy.cnfを、/etc/init.dではなく、/var/mariadb/dataに格納しています。即ち、これは、mysqlコマンド実行時に自動的に読み込まれる場所ではありません。従って、ローカルからmysqlコマンドで接続する際に、自動的に読み込まれるパスに、別途クライアント用のmy.cnfを作成しなければならないということです。
今回は、~/.my.cnfを作成することにしました。
[client] #password = your_password port = 3306 socket = /tmp/mysql.sock default-character-set=utf8
最後の1行でUTF-8を設定しています。
まあ、この設定をしなくても、mysqlコンソールに接続する度に、
SET NAMES utf8;
とすれば良いみたいですけど、面倒なので、上記のように設定ファイルを使うことにしました。
これで、サーバー、クライアント共に文字列エンコードの設定ができたので、安心してCSVファイルをロードする作業に戻れます。
CSVデータをロードする
CSVファイルをテーブルにロードするには、mysqlコンソールから、以下のコマンドを実行すれば良さそうです。
LOAD DATA LOCAL INFILE "path/to/import.csv" INTO TABLE table_name FIELDS terminated by ',';
しかし、ここで少しはまってしまいました。
MariaDB [(none)]> use pizzadb; MariaDB [pizzadb]> LOAD DATA LOCAL INFILE "~/data.csv" INTO TABLE test_tbl FIELDS terminated by ','; ERROR 1148 (42000): The used command is not allowed with this MariaDB version
少し調べてみたところ、どうやらローカルファイルのロードはデフォルトでは無効になっているみたいです。*2
mysqlコンソールを起動するときに、
--enable-local-infile
を指定することによって、有効化できました。
まあ、これをやるのはマスタデータのロード時くらいで、インポートはそんなに頻繁にすることもないだろう、ということで、必要なときだけ、上記オプションを使用するということにしておきます。
ふう。
今日はここまでにしておきます。
これまでの作業で、データベースの入れ物となる部分と初期データの登録方法までわかりました。しかし、DDLのロードオペレーションが分かったというだけで、実際にはまだテーブルの物理設計の方法、その詳細が不明です。次回はその辺りを追ってみたいと思います。
- -