MySQL

実行に時間のかかるSQLを記録する

twitterにハマって1ヶ月も放置していたけれど、今日からまた再開。 現在SQLの最適化で絶賛悩み中。下手くそなSQLのせいで、100万件のデータを毎回全部読んでしまう。コンソールから直接SQLを流して、平均2〜3秒。PHPのアプリ経由だと5秒以上かかる。お話にな…

PHP経由での「SET NAMES」はよろしくない

散々言及されてるみたいだけど、PHPでmysql_query('SET NAMES sjis')とか発行すると、SQLインジェクション脆弱(ぜいじゃく)性を作り込む危険性があるらしい。コンソールからの利用は問題無し。 幸いにも未だ使った事は無いので、今後そういうケースに遭遇し…

Fedora10でphpMyAdminを動かす

開発環境構築メモ。 本家サイトで最新版をダウンロードして、DocRoot下に解凍・設置。 その後、config.inc.phpを作成すればOK。 ;; /var/www/html/pmaにしてみた $ cd /var/www/pma ;; 設定ファイルを流用 $ cp config.sample.inc.php config.inc.php ;; 適…

地図情報を扱えるgeometry型

MySQLにGoogleMapの地図情報なんかを保存する時、今まではfloat型のカラム2つ用意して経度・緯度をそれぞれ格納、とかしてた。 けど、この型を使えばまとめて保存出来るみたい。 ポイントは、 INSERT時は「GeomFromText」関数で座標データを変換してやる事 S…

BINARY属性で大文字・小文字を区別する

CHARやVARCHARといったカラムでのソートや文字列比較は、大文字・小文字を区別しないらしい。 そこで、カラムにBINARY属性を指定しておくと、大文字・小文字を区別してくれるようになる。 BINARY属性は後から指定する事も可能。 これは便利。有効に活用しよ…

CONCAT関数で連結文字列を取得

それでも続くMySQLネタ。 CONCAT関数を利用すると、カラムの文字列を連結したり出来る。 CONCAT(str1, str2, str3, ...)POINT 引数にNULLが含まれると問答無用でNULLを返す INT型などを引数で渡すと、自動的に文字列型にキャストされる mysql> SELECT CONCAT…

CASE式の書式

しつこく続くMySQLネタ。 CASE WHEN [判定式] THEN [式が真の場合] ELSE [WHEN句に該当しなかった場合] ENDWHEN〜THEN〜は追加する事も可能。その場合、WHEN句が真になった時点で判定は終了し、以降のWHEN句は無視されるらしいので注意が必要。 カラムとして…

テーブルの先頭にカラムを追加

最近続くMySQLネタ。 mysql> ALTER TABLE table_name ADD COLUMN [カラム名とか型とか制約とか] FIRSTいっつもAFTER column_nameばかりだったので、前に追加ならBEFORE column_nameとかあるんでないの??と勝手な思い込み。 Syntax errorをくらって真面目に調…

MySQLでテーブルの構造を確認

構文本来の目的は置いといて… mysql> SHOW CREATE TABLE table_name;または mysql> DESCRIBE table_name;で確認可能。 余談として、上のSQLは文末に「;(セミコロン)」ではなく「\G」を付けると結果の出力が見やすい。 下はDESCRIBEをDESCと短縮記述してもOK。…

CSVファイルのインポート/エクスポート

フィールド区切りは「,(カンマ)」前提 ;; インポート mysql> LOAD DATA INFILE "/path/to/file" INTO TABLE table_name FIELDS TERMINATED BY ','; ;; エクスポート mysql> SELECT * FROM table_name INTO OUTFILE "/path/to/file" FIELDS TERMINATED BY ','…

MySQLからログアウト

今まで端末でログインしたMySQLからログアウトする時には mysql> QUIT; Byeか mysql> EXIT; Byeとしていた。けれど、 mysql> \q Byeでもログアウト出来る事を初めて知った。 タイプが2文字減るだけだけれど、こういう所は楽をしたい(^^)

文字列を指定文字で埋める

LPAD(文字列, 文字数, 指定文字) ;左埋め RPAD(文字列, 文字数, 指定文字) ;右埋めこれで、文字列を文字数分切り出し、文字数-文字列分を指定文字で埋めてくれる。 自分で書いてて何のコッチャ意味不明なので、以下のように使う。 LPAD('abc', 5, '*') -> '*…

Shift-Jisの代表的な5C文字

文字 読み ー ダッシュ ソ そ[カタカナ] 噂 うわさ 圭 けい 構 こう・かま[える] 蚕 かいこ 十 10[漢数字] 申 しん・もう[す] 貼 は[る] 能 のう 表 ひょう・あらわ[す] 暴 ぼう・あば[れる] 予 よ・あらかじ[め] Wikipediaにはもっといっぱい載ってたけど、…

列名を変更せずにデータ型・定義を変更する

ALTER TABLE <テーブル名> MODIFY COLUMN <列名> <データ型> <定義>CHANGE COLUMNだと、列名に変更が無くても新旧2回書かなくちゃイケナイけど、これなら1回でいい。 毎日新しい発見ばかりだなぁ…(・x・ ).o0○

MyISAM、InnoDBの読み方

MyISAM --> マイアイサム InnoDB --> イノディービー本質的にはどうでもいい内容だとは自覚しつつ…。 「マイイザム」じゃないんだ、と目から鱗(゚ロ゚屮)屮

MySQLでユーザーのパスワードを設定

SET PASSWORD FOR ユーザー名@localhost=PASSWORD('パスワード');GRANT文しか知らなかった。SQLももっと勉強しなくちゃ… φ(゚-゚=)メモニャン