MySQLの最近のブログ記事
はじめに
↓こちらの記事をもとに、DTIのVPSサーバ(エントリープラン、月額490円)でLAMP環境をバージョンアップしてみました。ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編) - さくらインターネット創業日記
batch.sqlファイルに実行したいSQL文をあらかじめ書いておいて、
mysql -h host -u username -ppassword dbname < batch.sql
(↑ -pの直後に続けてパスワードを書きます。)例として、下記のようなint型のカラムがあったとします。
+---------------+
| starttime |
+---------------+
| 1187015526 |
| 1187024827 |
| 1187099887 |
| 1311443077 |
| 1311443081 |
+---------------+
自分のMobableTypeのmt_entryテーブルの中身がどうなっているかを調べてみました。
あくまで自分のケースなので、他のケースでもうこうなっているとは限りません。ちなみに私はほとんどMTをカスタマイズしておらず、ブログも1つしか運営していません。
私と同じような使い方をしている場合は、同じようなデータになっていると想像できます。
DBはMySQLです。
何かのお役にたてばと思い、作成してみました。
varchar 可変長
例えばchar(4)の場合だと、'a'が格納されても'abc'が格納されても4バイト占有する。
http://dev.mysql.com/doc/refman/5.1-olh/ja/char.html
$ sudo /etc/init.d/mysql start ←起動
$ sudo /etc/init.d/mysql stop ←停止
$ sudo /etc/init.d/mysql restart ←再起動
MySQLのINT型の最小値と最大値は、-2147483648~2147483647です。
MySQL 5.1 リファレンスマニュアル :: 10 データタイプ :: 10.2 数値タイプこの数字を覚えるコツをお教えしましょう。
「都道府県マスタ」テーブルを作って、CRUD(レコード追加、読み取り、変更、削除)を行います。
注:
- コマンドラインから実行することを想定しています。
- ユーザ名、パスワード、DB接続情報などは環境に合わせて変更してくださいね。
- サンプルではMySQLを使用していますが、他のRDBMSにも使えると思います。
#!/usr/bin/perl
use strict;
use warnings;
use DBI;
my $user = 'username';
my $passwd = 'pass';
my $host = 'localhost';
my $dbname = 'mysample';
my $dbh = DBI->connect("DBI:mysql:$dbname:".$host, $user, $passwd);
my $sql;
my $sth;
# CREATE TABLE
$sql = "CREATE TABLE prefmaster ( id INT , name VARCHAR(255) ) ";
$dbh->do($sql);
# INSERT
$sql = " INSERT INTO prefmaster (id,name) values (1, 'hokkaido') ";
$dbh->do($sql);
$sql = " INSERT INTO prefmaster (id,name) values (2, 'akita') ";
$dbh->do($sql);
# SELECT
$sql = "SELECT * FROM prefmaster";
$sth = $dbh->prepare($sql);
$sth->execute;
print "SELECT\n";
while(my @a = $sth->fetchrow_array){
print "@a\n";
}
print "\n";
# UPDATE
$sql = " UPDATE prefmaster SET name = 'iwate' WHERE id = 2 ";
$dbh->do($sql);
# DELETE
$sql = " DELETE FROM prefmaster WHERE id = 1 ";
$dbh->do($sql);
# SELECT AGAIN
$sql = "SELECT * FROM prefmaster";
$sth = $dbh->prepare($sql);
$sth->execute;
print "SELECT\n";
while(my @a = $sth->fetchrow_array){
print "@a\n";
}
print "\n";
# DROP TABLE
$sql = " DROP TABLE prefmaster ";
$dbh->do($sql);
$sth->finish;
$dbh->disconnect;
※ このページは自分用メモなので随時書き換えます。
PHPからMySQLに接続しようとしたら、
Warning: mysql_connect(): Client does not support authentication
protocol requested by server; consider upgrading MySQL clientというエラーが出たので、いろいろ調べてみました。
あるブログ記事に対処法が書いてありました。
こんな感じのエラーが出た場合は、 SET PASSWORD FOR root@localhost = OLD_PASSWORD('password_str'); で解決。
実際やってみたところ、MySQLのコマンドプロンプトで、
mysql > SET PASSWORD FOR root@localhost = OLD_PASSWORD('パスワード文字列');
と入力すると解決しました。
ご親切な記事をありがとうございます。
MySQLを、コマンドラインで操作して遊んでみました。
やっぱり、コマンドラインからDBを直接叩くというのは気持ちがいい。
なにかこう、コンピュータと直接対話している気がする。
黒い画面に白い文字。
コンピュータの画面はこれに限る。
CPANコマンドを使ってDBD::mysqlをインストールしようとしたら、変なエラーが出ました。
半年ほどさぼってたMySQL、また勉強し始めました。
前回、LAMPデビューしたとか言ってうかれてた直後、結局MySQLで挫折してたのでした。
挫折した原因は。。。
①文字化け問題
そもそも文字コードの違いをよくわかってなかったので、DBに格納したデータが文字化けを起こした。
たぶん、phpMyAdminがUTF5のため、Webアプリから入力したデータとphpMyAdminからSQLで注入したデータが混在して、文字化けしたんだと思われる。
②DBIの使い方
MSAccessは結構使ってたのでSQL自体はそれほど難しくなかったんだけど、DBIでSQLを使ってデータを取り出すのが意外と難しい。
「"」とか「'」のクオテーションが抜けてると動かなかったり、SELECT文の結果を受け取るのにfetchrow_arrayみたいな関数を使わないといけないとか。prepareとかexecuteとかの意味がさっぱりわからん。
そこで今回は、
対策①:文字コードはEUCで統一。
→ これでだいぶ楽になりそう。
対策②:一行書いたら動作確認。
→ 時間はかかるが、これしかない。
これで、何とか難所を切り抜けられそうな気がします。
WEBページのFORM上で入力したデータを、mySQLのDBに格納するテストに成功!
パッケージとライブラリの使い方がだいぶ身についてきた。
今回初めて、
・cgi-lib.pl
・jcode.pl
を導入しました。
cgi-libは便利ですねー。
FORMデータを扱うのが一瞬でできました。
今まで一からコードを書いてた(コピペしてた)のがあほらしくなりました。
僕は「とほほのwww入門」でperlとcgiを覚えたので、ずっとあそこのサイトのコードを使いまわしてました。
wwwboardを改造してcgiを作ってました。
これは、あくまでperl/cgiの動作を見せるためのサンプルなので、本格的なWEBアプリには向いてなかったんですね。
とほほ。今気づきました。
コード書き直さなくっちゃ。
LAMP(Perl)の環境で、phpMyAdminからSQL文(insert)を発行してDBに日本語文章を格納し、
それをPerlのDBIで読み出したら謎の文字化けが・・・
文字コードをS-JIS,EUC,UTF8のどれで試してもうまくいかん。
う~ん誰か助けて!!
