Chat (Lingr.com)
Informaiton
Daily
Column
- MySQL日本語の旅(5/1)
- アクセス向上秘伝(5/9)
- 一風変ったHaskellλ門(6/13)
- SICP Answer Book (5/31) 問題3.26追加
Zope Solution
Extra
アーカイブ
OSS案内所
Site Info
関連リンク
前回、「都道府県」テーブルを、「日本」というデータベースの下に作り、 現在、以下のようにデータが入っている。
mysql> SELECT * FROM `都道府県`; +----------+----------+ | 名 | 都 | +----------+----------+ | 神奈川県 | 横浜市 | | 山梨県 | 甲府市 | | 北海道 | 札幌市 | | 愛知県 | 名古屋市 | +----------+----------+ 4 rows in set (0.00 sec) mysql>
どうテーブルを作ったかは、SHOW CREATE TABLE でわかるが
mysql> SHOW CREATE TABLE `都道府県`\G
*************************** 1. row ***************************
Table: 都道府県
Create Table: CREATE TABLE `都道府県` (
`名` varchar(20) default NULL,
`都` varchar(20) default NULL
) ENGINE=MyISAM DEFAULT CHARSET=eucjpms
1 row in set (0.00 sec)
mysql>
これによると、データベースエンジンとして MyISAMが指定されている。
このとき、このテーブルはどこに、どのように実現されているのであろうか。
今の私の環境では、 /usr/local/mysql/var が MySQLのデータディレクトリである。
データベース「日本」は、その下にあるディレクトリである。
shellもターミナルも文字コードは既にUTF-8(ja_JP.utf8)にしてある。
shell# LANG=ja_JP.utf8
shell# ls
内緒
drwx------ 2 mysql mysql 4096 10月 5 18:53 日本
shell# cd 日本
shell# ls
db.opt 都道府県.MYD 都道府県.MYI 都道府県.frm
shell#
となり、テーブル名はUTF-8のファイル名として利用されていることがわかる。
MySQLでは、テーブル名がファイル名の拡張子を除いた部分になり、 拡張子は使用するデータベースエンジンにより異なる。 拡張子の名前だけではなく、作られるファイル数が異なる。
MyISAMの場合:
テーブル名.frm テーブル定義が記述されているファイル
テーブル名.MYD データを保存するファイル
テーブル名.MYI インデックスを保存するファイル
コピー実験
データベースの場合、ディレクトリをコピーしたら新しいデータベースができた。
同じこと、つまりテーブルを構成するファイルをコピーしたら テーブルがコピーされるかどうか確認してみよう。 コピーして出来たファイルが、元のファイルと同じgroup, ownerになるように、 cp -p でコピーする。
shell# ls db.opt 都道府県.MYD 都道府県.MYI 都道府県.frm shell# cp -p 都道府県.MYD コピー.MYD shell# cp -p 都道府県.MYI コピー.MYI shell# cp -p 都道府県.frm コピー.frm shell# ls -l db.opt コピー.MYI 都道府県.MYD 都道府県.frm コピー.MYD コピー.frm 都道府県.MYI #shell
ファイルはちゃんとコピー、それも漢字を使ったファイル名にしたので、 漢字のテーブル名「コピー」でテーブルができているか確認しよう。
mysql> SHOW TABLES; +----------------+ | Tables_in_日本 | +----------------+ | コピー | | 都道府県 | +----------------+ 2 rows in set (0.00 sec) mysql>
ちゃんと出来たと認識されているようだ。 データを追加したり、削除したりして、大丈夫か確認してみよう。
mysql> INSERT INTO `コピー` VALUES('宮城県','仙台市');
Query OK, 1 row affected (0.00 sec)
mysql> DELETE FROM `コピー` WHERE `名`='山梨県';
Query OK, 1 row affected (0.03 sec)
mysql> SELECT * from `コピー`;
+----------+----------+
| 名 | 都 |
+----------+----------+
| 神奈川県 | 横浜市 |
| 北海道 | 札幌市 |
| 愛知県 | 名古屋市 |
| 宮城県 | 仙台市 |
+----------+----------+
4 rows in set (0.00 sec)
mysql>
間違いなく動いているようである。
フィードバック:
There is no comment.