2011年8月17日 #mysql #sql #oracle

これが既存データで、同じ日に複数のデータがある。

Example data

期望結果はこれ、つまり日付別で集計したい場合

Expected result

MySQLではDATE関数を使う

mysql> SELECT DATE(create_datetime), COUNT(*) FROM user_m GROUP BY DATE(create_datetime);

Oracleではto_char関数を使う

SELECT to_char(create_datetime, 'YYYY-MM-DD'), COUNT(*) FROM user_m GROUP BY to_char(create_datetime, 'YYYY-MM-DD');

参考

問題

新しい mysqlnd ライブラリは、MySQL 4.1 用の41バイトの新しいパスワードフォーマットを使用します。 古い16バイトのパスワードを使うと、mysql_connect() 系の関数は次のようなエラーメッセージを生成します。”mysqlnd cannot connect to MySQL 4.1+ using old authentication”

MacPortでインストールしたPHP5.3では、

mysqlnd(php5.3のmysql native client)が適用される。
しかし、CentOSなどのyumでインストールできるMySQLサーバーとの相性がよろしくない。
PHP Warning: mysql_connect(): mysqlnd cannot connect to MySQL 4.1+ using old authentication
というエラーが現れ、接続することができません。
mysqlndを利用しないよう再コンパイルが必要となる。

解決方法

portでインストールしたモジュールを確認、mysqlndがactiveなってるはず。

sudo port installed

php5-mysql @5.3.5_0+mysqlnd (active)

そしてmysql5のvariantsを指定で再インストール。

% sudo port install php5-mysql +mysql5

--->  Computing dependencies for php5-mysql
--->  Fetching php5-mysql
--->  Verifying checksum(s) for php5-mysql
--->  Extracting php5-mysql
--->  Configuring php5-mysql
--->  Building php5-mysql
--->  Staging php5-mysql into destroot
--->  Installing php5-mysql @5.3.5_0+mysql5
--->  Deactivating php5-mysql @5.3.5_0+mysqlnd
--->  Cleaning php5-mysql
--->  Activating php5-mysql @5.3.5_0+mysql5
--->  Cleaning php5-mysql

再度port installedで確認すればmysql5がactiveになるはず。これで解決。

php5-mysql @5.3.5_0+mysqlnd
php5-mysql @5.3.5_0+mysql5 (active)

参考

【php】mysqlndを使うとMySQLに接続できない
http://www.softel.co.jp/blogs/tech/archives/2225

SnowLeopard + PHP5.3でのMySQLリモート接続
http://taikimen.blogspot.com/2010/10/snowleopard-php53mysql.html

PHP: mysqlnd cannot connect to MySQL 4.1+ using old authentication
http://www.bitshop.com/Blogs/tabid/95/EntryId/67/PHP-mysqlnd-cannot-connect-to-MySQL-4-1-using-old-authentication.aspx

おまけ

mysqlが古い16バイトのパスワードを使ってるかを確認する方法です。
mysqlにログインして下記コマンドを実行:

mysql> select password('aa');

+------------------+
| password('aa')         |
+------------------+
| 0123456789abcdef |
+------------------+

16位だっだら古いです。40位なら新しいってことです。

2010年12月 7日 #mysql #sql

1000件くらいのinsert文を用意して、それをコピって一気にmysqlのコマンドラインに貼りつけたらうまく行かなかったんです。sql文に文法的間違いがなくてもエラーとなったり、表示が崩れたりしました。数件なら多分まだいいんですけど、さすが1000件だと(コマンドラインに貼り付けるやり方では)処理が追えない気がします。

それらのsql文をファイルに保存し実行すれば問題なかったので、以下がそのコマンドです。

mysql> source file_name
--あるいは
mysql> \. file_name

また下記文を書けば進捗情報が見れるとMySQLのレファレンスで書かれてますが、時間の関係上今回は試してませんでした。

SELECT '<info_to_display>' AS ' ';

参考:
http://dev.mysql.com/doc/refman/5.0/en/batch-commands.html

2010年12月 7日 #sqlite #mysql #transaction

autocommitの値を持ちましてMySQLでのトランザクションを制御できます。

--暗黙(自動)コミットを無効に
SET AUTOCOMMIT = 0;
--トランザクション開始
BEGIN;

--SQL文をながす
UPDATE...
INSERT...

--コミット
COMMIT;
--あるいはロールバック
ROLLBACK;

--暗黙(自動)コミットを有効に
SET AUTOCOMMIT = 1;

--暗黙(自動)コミットのステータスを確認
SELECT @@AUTOCOMMIT;