$encod$#INGu = ‘ujis’; // ‘utf8’, ‘cp932’ ..
$con->query(‘SET NAMES ‘.$encoding);
などとすると、いちいち送受信時に mb_convert_encoding() とかしてやる必要は皆無になる。
通信時
MySQL4.x で IP アドレスを保存するには、int にして、関数で変換して利用してやると文字列よりも加工がしやすい。
mysql> SELECT INET_ATON(“209.207.224.40”);
-> 3520061480mysql> SELECT INET_NTOA(3520061480);
-> “209.207.224.40”
ネットマスクは例えば次のようにチェックできる。
mysql> select INET_ATON(“192.168.0.255”) & INET_ATON(“192.168.0.0”) = INET_ATON(“192.168.0.0”);
-> 1
mysql> select INET_ATON(“192.167.255.1”) & INET_ATON(“192.168.0.0”) = INET_ATON(“192.168.0.0”);
-> 0
– ORDER BY と LIMIT を使えばよい。UPDATE にもあるとは知らなかった..迂闊。
<http://dev.mysql.com/doc/mysql/ja/update.html>
– MySQL リファレンスマニュアル :: 6.4.4 UPDATE 構文
UPDATE [LOW_PRIORITY] [IGNORE] tbl_name
SET col_name1=expr1 [, col_name2=expr2 …]
[WHERE where_definition]
[ORDER BY …]
[LIMIT row_count]
最初こういうことをやって、同じテーブルに対して更新と参照を同時にやるなと怒られた。
UPDATE footable SET name = ‘foo’ WHERE id = (SELECT id FROM footable
WHERE gender = 1)
– LAST_INSERT_ID() を使うとよい。
INSERT INTO user_list (id,name) values (555, “foo”);
SELECT LAST_INSERT_ID();
+——————+
| LAST_INSERT_ID() |
+——————+
| 555 |
+——————+
という感じ。コネクション単位で保持しているので、同時アクセスがあっても干渉しない。ただし、取得する ID は AUTO_INCREMENT でなければならない。
http://dev.mysql.com/doc/mysql/ja/getting-unique-id.html
– MySQL リファレンスマニュアル :: 11.1.12.3 最後に挿入したレコードの一意な ID はどのように取得するのか
– ENUM 型のカラムには、リストにない任意の文字列をエラーなしで指定できてしまうため、不具合の温床になりうる。例えば次のテーブルを考える。
CREATE TABLE `foo` ( `number` ENUM(‘zero’,’one’,’two’) NOT NULL DEFAULT ‘zero’);
これに zero, one, two 以外の値が入ることは望ましくないが、リストにない文字列をいれることで空文字が入ってしまう。
mysql> INSERT INTO `foo` VALUES (‘six’);
Query OK, 1 row affected, 1 warning (0.03 sec)
mysql> select * from foo;
+——–+
| number
+——–+
|
+——–+
1 row in set (0.02 sec)
これは typo でも発生してしまうため、TINYINT などを使って、マジックナンバーは各言語の const 変数でラップしたほうがエラーを捕捉できていいかなと。