SQL*Plus上でSQLファイルを実行する
Oracle DBの対話型シェル「SQL*Plus」上で、SQL文が記入されたスクリプトファイルを実行する必要が出てきた。ご存知の方にはなにも珍しくない内容だと思うが、私には初めての作業だったのでメモっておく。
やりかた
絶対パスの場合
SQL> @/path/to/sql/file/test.sql
相対パスの場合
SQL> HOST pwd /path/to/sql/file SQL> @@test.sql(続きを読む…)
略称:「かっぱ研」
Oracle DBの対話型シェル「SQL*Plus」上で、SQL文が記入されたスクリプトファイルを実行する必要が出てきた。ご存知の方にはなにも珍しくない内容だと思うが、私には初めての作業だったのでメモっておく。
SQL> @/path/to/sql/file/test.sql
SQL> HOST pwd /path/to/sql/file SQL> @@test.sql(続きを読む…)
oci経由でOracleへ接続するPDOオブジェクトをnewしようとすると例外が送出される。
$pdo = new PDO('oci:', '{DATABASE}', '{PASSWORD}') ;
// => SQLSTATE[]: pdo_oci_handle_factory: OCI_INVALID_HANDLE (/usr/local/build/php-5.2.8/ext/pdo_oci/oci_driver.c:578)
(続きを読む…) 仕事でMySQLを触る時間が増えてくると、いろいろ知らなかったことやハマりが出てくる。いろいろ勉強になって楽しいなぁと思いつつ、今週引っかかったネタをひとつご紹介。
mysqldumpコマンドでダンプしたSQLは、デフォルトオプションではテーブルロックが付与されている。INSERTを高速にする効用があるが、投入するユーザに「LOCK TABLES」の権限がないと失敗する。
% mysql -u{username} -p{password} {database} < dump.sql
error: 1044: Access denied for user '{username}'@'localhost' to database '{database}' when using LOCK TABLES
(続きを読む…) MySQLで文字列を検索対象にした場合、一般的なデフォルト設定では大文字・小文字を区別しない。この問題にしっかりハマってしまったので、調査と対策を行ったメモを晒すことにした。
基本的なことがらなのにものすごく長いので「ダイジェスト」を読んでいただければおおむねOKにしてある。検証過程に興味のある方はその続きをどうぞ。
MySQLはデフォルトで運用すると文字列の比較 / 並び替えで大文字 / 小文字を区別しない。
大文字小文字を区別して検索するには…
…での対応が可能。
-- CREATE TABLE時にテーブルのデフォルト文字コードと照合順序を指定する CREATE TABLE hoge1 ( id INTEGER PRIMARY KEY AUTO_INCREMENT, str VARCHAR(16) ) ENGINE = InnoDB, CHARSET = utf8, COLLATE = utf8_bin ; -- ALTER TABLEで文字コードと照合順序を変換する ALTER TABLE hoge2 CONVERT TO CHARACTER SET utf8 COLLATE utf8_bin ;
-- CREATE TABLE時にカラムの文字コードと照合順序を指定する CREATE TABLE hoge2 ( id INTEGER PRIMARY KEY AUTO_INCREMENT, ci_str VARCHAR(16), cs_str VARCHAR(16) BINARY, other_str VARCHAR(16) CHARACTER SET utf8 COLLATE utf8_bin ) ENGINE = InnoDB ; -- カラムの文字コードと照合順序を変換する ALTER TABLE hoge2 CHANGE COLUMN ci_str ci_str VARCHAR(16) COLLATE utf8_bin ;
-- 大文字小文字を区別するカラムで区別せずに検索 mysql> SELECT * FROM hoge2 WHERE LOWER(cs_str) = 'fuga' ; -- 大文字小文字を区別しないカラムで区別して検索 SELECT * FROM hoge2 WHERE BINARY ci_str = 'fuga' ;
# 普通にfilterする => カラムのcollationに依存 ruby-1.9.1-p378 > Hoge2.filter(:ci_str => 'fuga').sql
=> "SELECT * FROM `hoge2` WHERE (`ci_str` = 'fuga')"
# likeでfilter => BINARYキーワードをつけてくれる ruby-1.9.1-p378 > Hoge2.filter(:ci_str.like 'fuga').sql
=> "SELECT * FROM `hoge2` WHERE (`ci_str` LIKE BINARY 'fuga')"
# ilikeでfilter => カラムのcollationに依存 ruby-1.9.1-p378 > Hoge2.filter(:ci_str.ilike 'fuga').sql
=> "SELECT * FROM `hoge2` WHERE (`ci_str` LIKE 'fuga')"
# case-sensitiveなカラムを大文字小文字無視してSELECT ruby-1.9.1-p378 > Hoge2.filter{ |f| [f.lower(:cs_str) => 'fuga'] }.sql
=> "SELECT * FROM `hoge2` WHERE ((lower(`cs_str`) = 'fuga'))"
以上がダイジェスト。あとは検証過程なので興味と時間的余裕がある方はどうぞ。
(続きを読む…)時々発生する「インストールしたてのMySQLに開発環境を構築する」という作業のために手順メモ。レベルの低い記事で恐縮だが、自分用メモということでご容赦願いたい。
あけました(諸事情により「おめでとう」略)。本年もKwappa開発室をよろしくお願いいたします。
さて新年最初のエントリは、昨年より継続中の「社内勉強会」。年内でRuby on Rails編が一段落したので、ジャンルを限定せずに続けていく所存である。
2009年第1弾はPostgreSQLでのパフォーマンスチューニング入門。担当しているサービスのあちこちに、前任者が置いていった凶悪なクエリが散在している。そんな状況を打破すべく、オラクルマスタの同僚に講師を依頼した。
ちょっとだけ去年の最終回に続けて12/24に開催しようか…とも思っていたのだが、準備の都合や家庭の事情などを鑑みて新年初回の開催となった。
スライドの崩れっぷりにhandsoutへの移行も検討しているが、内容は大変しっかりしたものになった。。私もいい加減な知識で実装していた部分に気づかされたので、空気を読める開発者となるべく精進しよう。