|
Top > MySQL MySQL のリファレンスマニュアルはけっこう読みやすいので、ちゃんとこれを読みましょう。 関連ページ:文字コード/MySQL+Javaの文字化け クイックリファレンス
|
| 型 | バイト | 最小値 | 最大値 |
| TINYINT | 1 | -128 | 127 |
| SMALLINT | 2 | -32768 | 32767 |
| MEDIUMINT | 3 | -8388608 | 8388607 |
| INT(INTEGER) | 4 | -2147483648 | 2147483647 |
| BIGINT | 8 | -9223372036854775808 | 9223372036854775807 |
| DATE | - | 1001-01-01 | 9999-12-31*1 |
| DATETIME | - | 1000-01-01 00:00:00 | 9999-12-31 23:59:59*2 |
文字列型
| 型 | 最大サイズ | バイト |
| VARCHAR | 65532 | 65533*3 |
| TINYTEXT または TINYBLOB | 2^8-1 | 255 |
| TEXT または BLOB | 2^16-1(64K-1) | 65535 |
| MEDIUMTEXT または MEDIUMBLOB | 2^24-1(16M-1) | 16777215 |
| LONGBLOB | 2^32-1(4G-1) | 4294967295 |
各データ型の必要容量
http://dev.mysql.com/doc/refman/5.1/ja/storage-requirements.html
auto_incrementは1から。
レコードをdeleteすると、そこは欠番となり、次回insertするレコードはmax(id)+1となる。
LOCK TABLES でテーブルをロックします。
トランザクションをサポートしていないストレージエンジンを MySQL で使用している場合、SELECT と UPDATE の間に他のスレッドに割り込まれないようにするには、LOCK TABLES を使用する必要がある。次の例では、安全に処理を実行するために LOCK TABLES を発行する必要がある。
mysql> LOCK TABLES trans READ, customer WRITE;
mysql> SELECT SUM(value) FROM trans WHERE customer_id=some_id;
mysql> UPDATE customer SET total_value=sum_from_previous_statement
-> WHERE customer_id=some_id;
mysql> UNLOCK TABLES;
http://dev.mysql.com/doc/refman/4.1/ja/lock-tables.html
varchar(10) のカラムに格納できるのは10バイトか10文字か?
答えはDBの文字コードによる。
文字コードが binary の場合は10バイト。utf8 の場合は utf8 で10文字。
こういった問題は、以下のようにして必ず実験してみること。
mysql> create table x (a varchar(10));
Query OK, 0 rows affected (0.00 sec)
mysql> insert into x (a) values ('あいうえおかきくえこさしすせそ');
Query OK, 1 row affected (0.00 sec)
キーとなるカラムをAUTO_INCREMENTにするのはよくある事で、データをInsertしてから、InsertしたレコードのAUTO_INCREMENT値を取得したいというのはよくある事です。
方法としては2つあり、PHPの関数 mysql_insert_id() で取得する方法と、MySQLの関数 last_insert_id() で取得する方法があります。
アクセス数が多く、Insertがほぼ同時に行われた場合に返ってくる値が別のレコードのものだったらどうしよう…という点については心配する必要がないです。同じクライアントからのアクセス内での直近Insertの値を返すようになっているので、それぞれ正しい値が返ってきます。
http://blog.tofu-kun.org/071206185929.php
mysqlimport が Oracle の SQL Loader に相当する。
mysqlimport -u USERNAME -p --local DBNAME TABLENAME.txt
ここで TABLENAME はインサートしたいテーブル名と同じでなくてはならない。
TABLENAME.txt の中身はタブ区切り。
オプション -d (--delete)をつけると、最初にテーブルの全行を削除する。
オプション -r (--replace)をつけると、unique 制約に違反する場合や primary key がかぶる場合、上書きしてくれる。
つまり、 -d -r と同時に指定すれば、テーブルの中身をファイルの中身と一致させることができる。これは便利。
mysql> insert into x (a) values ('あいうえおかきくえこさしす');
Query OK, 1 row affected, 1 warning (0.00 sec)
↑ 1 warnings と出ているが、この内容はなんなのか?
show warnings を使う。
mysql> show warnings; +---------+------+----------------------------------------+ | Level | Code | Message | +---------+------+----------------------------------------+ | Warning | 1265 | Data truncated for column 'a' at row 1 | +---------+------+----------------------------------------+ 1 row in set (0.00 sec)
warnings;
をしておくと、毎回 SQL の実行後自動的にこの内容が表示されるようになる。
まず 文字コード関連システム変数を確認します。
そして hex() を使ってレコードの中身を16進ダンプし、データが正しく保存されているか見てみます。
mysql> select a,hex(a) from x; +-----------+--------------------+ | a | hex(a) | +-----------+--------------------+ | あいう | E38182E38184E38186 | +-----------+--------------------+ 1 row in set (0.00 sec)
「あいう」は UTF-8 で「E3 81 82 E3 81 84 E3 81 86」なので、データは正しく保存されています。
これで文字化けが発生するということは、データ取得時にクライアントの文字コードへ変換するときに化けているのかも。
mysql> create table x (a varchar(10));
Query OK, 0 rows affected (0.01 sec)
mysql> insert into x (a) values ('ABCDEFGHIJKL');
Query OK, 1 row affected, 1 warning (0.00 sec)
mysql> select * from x;
+------------+
| a |
+------------+
| ABCDEFGHIJ |
+------------+
1 row in set (0.00 sec)
/etc/my.cnf。
Ubuntu では /etc/mysql/my.cnf。
my.cnf のパーミッションが誰でも書き込めるようになっていると、MySQL はそのファイルを読み込まない。
以下のような警告を出す。
Warning: World-writable config file '/etc/my.cnf' is ignored
/var/lib/mysql
の中に各データベース名のディレクトリがある。
/var/lib/mysql/ホスト名.err
/var/lib/mysql に -bin がつくファイルがある。これが Oracle の REDO ログみたいなもので、
最後にバックアップして以来の全更新 SQL が記録されている。
mysqlbinlog -s /var/lib/mysql/mysql-bin.000003 (最後のファイル名は例)
で今までに実行した更新系のSQL だけは表示できる。
しかしシステムが自動的に発行した SQL も記録されているし、SELECT 文は表示されないので
開発時のデバッグ用としては使いづらい。
http://blog.tofu-kun.org/070721115104.php#extended
GRANT ALL PRIVILEGES ON *.* TO user@localhost IDENTIFIED BY 'password' WITH GRANT OPTION; GRANT ALL PRIVILEGES ON *.* TO user@"%" IDENTIFIED BY 'password' WITH GRANT OPTION;
'password'はパスワード。
ユーザー一覧
select user from mysql.user;
データベース一覧
show databases
テーブル一覧
show tables
ビュー一覧
show viesはない。
show tables
で出てくる。
トリガー一覧
show triggers
MySQL :: MySQL 5.1 リファレンスマニュアル :: 21 INFORMATION_SCHEMA データベース
http://dev.mysql.com/doc/refman/5.1/ja/information-schema.html
information_schemaがOracleのデータディクショナリ・ビューに相当する。
テーブル一覧をselectする。
>select table_name,table_type,engine from information_schema.tables where table_schema='DBNAME'; +------------+------------+--------+ | table_name | table_type | engine | +------------+------------+--------+ | composer | BASE TABLE | MyISAM | | hoge3 | BASE TABLE | MyISAM | +------------+------------+--------+ 2 rows in set (0.05 sec)
http://kanitotomato.dip.jp/~ao/pp/index.php?cmd=edit&page=MySQL&id=kec34ba9
外部キー制約を無効にする。
set foreign_key_checks = 0
http://dev.mysql.com/doc/refman/5.1/ja/innodb-foreign-key-constraints.html
(es@localhost)[es]> show status like 'Threads%'; +-------------------+-------+ | Variable_name | Value | +-------------------+-------+ | Threads_cached | 0 | | Threads_connected | 1 | | Threads_created | 5276 | | Threads_running | 1 | +-------------------+-------+ 4 rows in set (0.00 sec)
mysql> show variables like 'char%'; +--------------------------+--------------------------------+ | 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 | utf8 | | character_set_system | utf8 | | character_sets_dir | C:\xampp\mysql\share\charsets\ | +--------------------------+--------------------------------+
ちなみにこれはPHPからでも普通にqueryできる:
$rs = $db->getAll("show variables like 'char%'");
MySQL 5.1
http://dev.mysql.com/doc/refman/5.1/ja/server-system-variables.html
サーバは受け取ったデータが character_set_client でエンコーディングされていると仮定し、
内部で client→connection の変換を行う。
サーバから送るときは results でエンコーディングする。
[mysqld] default-character-set = utf8
[mysql] default-character-set = utf8
default-character-set は character-set-server をうけて将来的に廃止予定。
$db->query("set names utf8");
auto-reconnect をオンにして mysql コマンドを使っている場合は、
set names utf8;
より
charset utf8;
の方がよい。こうすると再接続のたびに自動的に set names utf8; を実行してくれる。
以下のコマンドで使える文字コード名を全て表示。
mysql> show character set;
代表的なもの
| binary | Binary pseudo charset | binary | 1 | | sjis | Shift-JIS Japanese | sjis_japanese_ci | 2 | | cp932 | SJIS for Windows Japanese | cp932_japanese_ci | 2 | | eucjpms | UJIS for Windows Japanese | eucjpms_japanese_ci | 3 | | ujis | EUC-JP Japanese | ujis_japanese_ci | 3 | | utf8 | UTF-8 Unicode | utf8_general_ci | 3 | | ucs2 | UCS-2 Unicode | ucs2_general_ci | 2 |
基本的にcp932/eucjpms/utf8は相互に変換できるように作られている(しかしutf8にしかない文字をcp932/eucjpmsに変換しようとした場合などは当然化ける)。
sjis/ujisは九バージョンの名残であり、MySQL 5.0の環境であれば、sjis/ujisを使う必要はないだろう。
参考:現場で使えるMySQL
MySQL は localhost からの接続権限と他のマシンからの接続権限を別々に設定できるので、その辺を確認してみること。
http://www.rfs.jp/server/mysql/02/02.html
/.my.cnf に書く。
[mysql] # warning が発生したとき、自動的に内容を表示する。 show-warnings # コマンドラインのプロンプト(例:(root@localhost) [test]> ) \_はスペース prompt=(\u@\h) [\d]>\_ # タブで補完が効くようにする auto-rehash
SQLの最後に「\G」をつけると見やすくなる。
select * from tb_user \G
http://norainu.net/mt/archives/2006/09/mysql_g.html
薫のhack
http://paranoid.dip.jp/kaworu/cat_mysql.html