1,MySQLの検索時の大文字、小文字
・MySQLでは検索などを行う際に、大文字、小文字、全角、半角を区別しない。
utf8_general_ci と utf8_unicode_ci を設定によって何を区別するかは異なる。
utf8_general_ci
大文字小文字は区別しない。
全角半角は区別する。
utf8_unicode_ci
大文字小文字は区別しない。
濁音、半濁音、ひらがな、カタカナ、英語、全角半角を区別しない。
ところが、これらを指定していたとしても関数内では適用されない。
例えばREPLACE(置換)では、大文字、小文字、全角、半角を区別する。
例)
; aaa = "BBB"というデータが入っているとする
SELECT COUNT(*) FROM DUMMY WHERE aaa = "bbb";
上記クエリの実行すると結果は1が返りますが
以下のクエリで置換することはできません。
SELECT REPLACE (aaa, "bbb","ccc") FROM DUMMY;
2, MySQLの同一テーブルでのサブクエリ
MySQLでは通常、更新系クエリ(UPDATE, DELETE, INSERT)文では
同じテーブルをサブクエリとしては使用できないとされています。
しかし、調査を行った所、サブクエリ内のテーブル名とカラム名のみチェックしており、
ネストしたサブクエリ(サブクエリのサブクエリ)はチェックが行われないことがわかりました。
-- NGパターン
UPDATE aTable SET aDate=NOW()
WHERE aID IN
(
SELECT MAX(aID) FROM aTable
);
ERROR 1093 (HY000): You can't specify target table 'aTable' for update in FROM clause
-- サブクエリのサブクエリを作成しテーブル名、カラム名をラップしてみる
UPDATE aTable SET aDate=NOW()
WHERE aID IN
(
SELECT id FROM (
SELECT MAX(aID) as id FROM aTable
) AS x
);
激重なクエリなので用途は限られますが、
弊社では定期的なアクセス解析時などに使用しています。