Tag Archives: MySQL

mysql5.1のrename databaseが動かない

1
Filed under MySQL
Tagged as

久しぶりに更新したと思ったら、そんな事かよと思われそうだけど、
一応メモ。

mysql5.1.7からdatabaseを手軽にrenameできる
RENAME DATABASE from_database_name TO to_database_name;
みたいのが使えるようになってるはずだったんだけど、
手元のmysql5.1.46で使えないなーっておもってたら、mysql5.1.23で以降で使えないという記事を見つけました。

その後、@morygonzalezさんに脆弱性か何かで消えたらしいという情報を頂いて、
英語のdocsみてみたら、ちゃんと書いてあった。

英語のdocs
http://dev.mysql.com/doc/refman/5.1/ja/rename-database.html

抜粋すると、

This statement was added in MySQL 5.1.7 but was found to be dangerous and was removed in MySQL 5.1.23.
要するに、5.1.7で追加してみたけど、危険なのが見つかったから、5.1.23で外したよってこと見たいですね

use of this statement could result in loss of database contents, which is why it was removed.
要するに、rename databaseを利用すると、データベースの内容が消える場合があるから、消しましたって事みたいですね

さらっと、怖い事書いてあるわけですね
とりあえず、rename databaseは使わないぞ!
バックアップに甘えはいけないぞ!
という強い気持ちをメモとして残す。(すぐ忘れそう。。)

使えると思ったのは、日本語版のサイト側にまだ和訳されたremovedの文章が追加されてないからだけど、
まあ、ちゃんと英語のみましょうねっていう事です。

日本語のdocs
http://dev.mysql.com/doc/refman/5.1/en/rename-database.html

さあ、たいした事じゃないけど、メモしたので、今日はこの辺で。

DB Error: mismatchがでたぞ!!

2
Filed under MySQL, php, SQL
Tagged as , , ,

php経由でMysqlに接続して処理してたときに
なんでか理由がわからないけどエラーがでた。

DB Error: mismatch

試した感じからすると、where句の内容に問題があるようだ。

【エラーが出る例】

select * from table where column != ? ;

  ※「?」はプレースホルダしてるから。
   ちなみにSSH経由でmysqlコマンドで接続して実行するとエラーにならない。

【エラーが出ない例】

 select * from table where column <> ? ;

  ※これだとエラーにならないわけです。

なんでですかね?
 phpとの相性?
 プレースホルダ絡み?
 phpの書き方に問題があった?

ちょっとわからないけど、備忘録として残しておきます。
知ってる人いたら、コメントください。

MySQLで”The used SELECT statements have a different number of columns”

0
Filed under MySQL, SQL
Tagged as ,

PHP&MySQLでSQLを書いてたときに、

“The used SELECT statements have a different number of columns”

みたいなエラーがでました。
グーグル先生に聞いたところ、MySQL本家サイトにも記述がありました。

理由としては、
UNIONを利用していて、片方だけにしか特定のカラムがない場合にでるようです。
出力カラムの数を数えるのと、カラム名を確認してみたらいいんじゃないでしょうか。

僕は単純にカラム数(column)がたりませんでした。

注意力が足りなくて、スミマメーン!

Commitは命じゃ!!

0
Filed under MySQL, php
Tagged as ,

PhpでMysql(innodb)を利用している場合に、
すごくはずかしい失態をおかしたので、
繰り返さないように、恥を公開しておこう。

autoCommit(false);

としてたわけですよ。
で、id を auto_increment するようなテーブルが複数あり、
それらを、insertとかしてたわけですよ。

でも、なぜかDBが更新されないわけですよ。

mysql_insert_id();

の関数を利用して直前のSQLのauto_incrementのIDを引っ張るわけですが、
これが、ちゃんとに取得できるわけですよ。
id が 100とかなってても、100のIDのレコードがテーブルに存在しないわけです。

もう全然わからないと思っていたところ、

commit()

部分を気持ちよく、綺麗さっぱりコメントアウトしてたわけです。
そりゃー 動くわけないですがな。

中途半端にまともなIDなんて返してくれちゃうから、
余計あせっちまいましたよ。

と、いったところで、自分のinnodbの扱いの認識不足と、
注意力不足が招いた結果ですけどね。。

MySQLでtableのカラム名(column)を調べる

2
Filed under MySQL
Tagged as , ,

久しぶりのエントリになりましたが、
最近多様するんだけど、覚えるほどでもないので、
メモとして残しておくことに。

SSHのターミナルとかから

mysql -h [host_name] -u [user_name] -p [database_name]

とかで接続している場合に、データが1件もないテーブルに向けて、
以下のように select をしても、0件という状態しかわからない。

select * from [table_name]

こんなときに、そのtableの中に、なんという名前のカラム(column?)があって
どういう型(intとかvarcharとか)になっているのかってのを
知りたいなって思うことありませんか??

僕はあります。
でも、AccessとかCSEで接続すると重いので、
DB操作系は、なるべくターミナルからやりたいわけですよ。

そんなときに活躍するのが、

show fields from [table_name];

これはいいですね。
これで、そのテーブルにどんなカラムがあって、
どんな型になっているか、まるわかりです。

MySQLのおすすめ書籍


MySQLでテーブルをコピー&リネーム

1
Filed under MySQL, SQL
Tagged as ,

MySQLを利用していて、テーブルをリネームしてみたくなったり、
コピーしてみたくなったりすることがありますよね。

なので、一応まとめときます。

【テーブルリネーム】

RENAME TABLE before_table_name TO after_table_name;

例:
  変更前のテーブル名が 「tec」 で
  変更後のテーブル名を 「log」 にしたい場合には、

RENAME TABLE tec to log;

次に特定のテーブルをコピーしたい場合です。

【テーブルコピー】

CREATE TABLE new_table AS SELECT * FROM old_table;

例1:
  コピー元のテーブル名が 「apple」 で
  コピー先「新規作成」のテーブル名が 「melon」の場合には、

CREATE TABLE melon AS SELECT * FROM apple;

例2:
特定の条件のもののみコピーしたい場合には WHERE句で指定して
  コピーすることもできます。

  コピー元のテーブル名が 「all」 で
  コピー先「新規作成」のテーブル名が 「now」で
  「Year」カラムが「2008」のもののみ抜き出す場合には、

  CREATE TABLE now AS SELECT * FROM all WHERE Year = ’2008′;

というような形になりますね。

ということで、久々の更新はこんな感じで。

MySQLのおすすめ書籍


MySQLの更新系SQLを省略する(autoExecute)

3
Filed under MySQL, SQL
Tagged as , ,

MySQLでinsertとかUpdateとかするときに、
SQLをかかずにサクサクやる方法があるそうな。
その名も「autoExecute」なり。

Insertしたい場合には、以下のような書き方になるようです。

$test1 = “test”;
$table = “mysql_test_table”

$Connect = DB::connect($Dsn);
if (DB::iserror($Connect)){
die($Connect->getMessage());
}

$Value = array(
‘name’ => ‘hattara’,
‘domain’ => ‘teclog.hattara.info’,
‘col1′ => $test1,
‘col2′ => ‘test2′
);

$Result = $Connect->autoExecute($table, $Value, DB_AUTOQUERY_INSERT);

if (PEAR::isError($Result)) {
die($res->getMessage());
}

$Connect->disconnect();

Updateしたい場合には、以下のような書き方になるようです。

$test1 = “test”;
$table = “mysql_test_table”
$xxxx = “xxxxx”

$Connect = DB::connect($Dsn);
if (DB::iserror($Connect)){
die($Connect->getMessage());
}

$Value = array(
‘name’ => ‘hattara’,
‘domain’ => ‘teclog.hattara.info’,
‘col1′ => $test1,
‘col2′ => ‘test2′
);

$Where = “col1 = ‘abcde’ AND col2 = ‘” . $xxxx . “‘”;

$Result = $db->autoExecute($table, $Value, DB_AUTOQUERY_UPDATE, $Where);

if (PEAR::isError($Result)) {
die($res->getMessage());
}

$Connect->disconnect();

まあ、要するに、

autoExecute(
<テーブル名>,
<変更カラム名と値の連想配列>,
<処理指定>,
< updateならwhereがあれば>
);

となりますね。<処理指定>の場所には、

  insertなら「DB_AUTOQUERY_INSERT」
  updateなら「DB_AUTOQUERY_UPDATE」

が入るわけです。

ただし、残念でならないのが、updateをする場合に、where句を指定できるのですが、
これがプレースホルダに対応していない。
なので、上記のwhereの部分で、変数部分にはエスケープ処理を入れないといけない。
なんか、あと一味足りない感じですね。

参考元:
「實松アウトプット」さん >> autoPrepareとautoExecuteのwhere句