‘MySQL’ カテゴリーのアーカイブ

照合順序をutf8_general_ciからutf8_unicode_ciへ変更する

2010 年 10 月 13 日 水曜日

MySQLにて照合順序(colllation)の変更をする機会があり、少し調べたので自分用メモ。

やりたいことは、utf8_general_ciになっているテーブル(&フィールド)を、utf8_unicode_ciにするということです。

簡単なことなのかもしれませんが、今まで途中から照合順序を変更したことが無かったので、なかなかいい機会となりました。

方法

テーブルの紹介順序は、下記のSQLで簡単に変更できました。

ALTER TABLE `テーブル名` COLLATE utf8_unicode_ci

が、、、しかし。すぐに気づかなかったのですが、これではフィールドの紹介順序は元のutf8_general_ciのまま変わらないんですね。
どうやら個別にフィールドも指定してやる必要があるようです。

ALTER TABLE `テーブル名` MODIFY COLUMN `フィールド名` VARCHAR(32) CHARACTER SET `utf8` COLLATE `utf8_unicode_ci`;

※VARCHAR(32)部分は任意の型です。元のデータ型から変更したくない場合でも、省略したらエラーになってしまうようです。ちなみにCHARACTER SET `utf8`は、もともとutf8だったからか、私の環境では省略できました。

変更したいフィールドが多いと結構大変そうですね。
変更が発生しないように、最初から適切に設定しておくことが一番なようです。

参考-テーブル作成時に照合順序を設定する方法

ちなみに、テーブル作成時に照合順序を設定する方法は、下記です。
(UTF-8/utf8_unicode_ciの場合)

CREATE TABLE `テーブル名` (
~テーブルの定義~
) DEFAULT CHARSET utf8 COLLATE utf8_unicode_ci;

MySQLで曜日ごとに集計する

2010 年 8 月 12 日 木曜日

PHP&MySQLでWebアプリ作成中に、曜日ごとの集計をすることに。
このあたりはよく忘れてその都度調べることになるので、自分用にメモ。

SELECT
(CASE
WHEN DATE_FORMAT(created, '%W') = 'Monday'    THEN '月曜日'
WHEN DATE_FORMAT(created, '%W') = 'Tuesday'   THEN '火曜日'
WHEN DATE_FORMAT(created, '%W') = 'Wednesday' THEN '水曜日'
WHEN DATE_FORMAT(created, '%W') = 'Thursday'  THEN '木曜日'
WHEN DATE_FORMAT(created, '%W') = 'Friday'    THEN '金曜日'
WHEN DATE_FORMAT(created, '%W') = 'Saturday'  THEN '土曜日'
WHEN DATE_FORMAT(created, '%W') = 'Sunday'    THEN '日曜日'
END) AS week,
COUNT(*) AS num,
COUNT(DISTINCT(cookie)) as `unique`
FROM logs
WHERE (user_id = :USERID AND status = 1)
GROUP BY week

これで、PHPからfetchしていけば、こんな感じで利用できます。

array(
	0 =>
	array(
		[week] => 月曜日,
		[num]  => 11770,
		[unique] => 3770,
	),
	1 =>
	array(
		[week] => 火曜日,
		[num] => 7770,
		[unique] => 3270,
	),
	~略
);

おまけ:PostgreSQL用!?

検索している最中にみつけたもので、PostgreSQL専用っぽいですがCASE部分はこんな書き方ができる模様。
こちらもあくまでも自分用のメモとして残しておきます(こちらは試してないので動くか分かりませんが)。

(CASE
WHEN DATE_PART('dow',created) = 0 THEN '日曜日'
WHEN DATE_PART('dow',created) = 1 THEN '月曜日'
WHEN DATE_PART('dow',created) = 2 THEN '火曜日'
WHEN DATE_PART('dow',created) = 3 THEN '水曜日'
WHEN DATE_PART('dow',created) = 4 THEN '木曜日'
WHEN DATE_PART('dow',created) = 5 THEN '金曜日'
WHEN DATE_PART('dow',created) = 6 THEN '土曜日' END ) AS week,