いっぽんの猟銃のむこうに (DAIZOじいさんとGun)

ヌルめの技術メモとか。フリーランスやってます (http://acez.jp/)

MySQL

Super-Smackの--with-oracleオプションはダミー

最近ではDBのサンプルデータベースを作るのに専らSuper-Smackを使ってたんですが(使い方は http://thinkit.co.jp/cert/article/0707/2/2/2.htm (自分メモ))久しぶりにconfigureしたらOracle指定ができたので、「あれ?Oracle対応してるのかな?」とか…

SYSDATEをSYSDATE()で置き換えるのはNG

結論から言うと「OracleのSYSDATEをMySQLに移行する場合はNOW()使え」ということらしい。 http://nippondanji.blogspot.com/2009/04/sysdatenow.html 以下検証ソース。 SQL> CONN / AS SYSDBA SQL> GRANT EXECUTE ON DBMS_LOCK TO SCOTT ; // 権限あげないと…

General error: 1449 The user specified as a definer ('test'@'10.100.%') does not exist

トリガをmysqldumpすると謎のdefinerとやらが含まれてしまい、それが原因になりimportに失敗することがある。(例のエラーメッセージのように接続元IPアドレス体系が異なるとか) じゃあどうすりゃいいの、というと、--skip-triggersオプションを指定してmys…

ストアド設定しようとしたらCannot load from mysql.proc. The table is probably corrupted

どうも5.1系から5.5系でMySQLのテーブル構造が変わるのが原因らしい。 http://readit.l8r.in/2011-06-22/mysqlcannot-load-from-mysql-proc/書いてある通りmysql_upgradeの実行で治ったんだが、サーバ自体は全部5.5系なのになんで?と思ってたら理由は古いmy…

別databaseに対してトリガをしかけることはできない

たとえばTEST1というdatabaseで、 create trigger TRIGGER_SAMPLE after UPDATE on TEST2.TESTTABLE for each row みたいなことをするとエラーになるので、無理。 「そんなことしねーよ」って普通思いますけど、やる人がいるかもわからんので。。。 というか…

ERROR 1347 (HY000): 'DBNAME.TABLENAME' is not BASE TABLE

なんでこうなるのかはわからないが、トリガ中でデータ型が違うSQLを書くと (例: SYSDATE()をvarcharカラムに叩きこむ)このエラーが出る。 にしてもMySQLは謎のエラーメッセージが多い。

MySQLではDELETE文のfrom句で指定する表名に別名はつけられない

Oracleだとできるし、当然SELECT文の場合は問題なくできる。 なんだかよくわかんない制限。

暗黙的トランザクション

MySQLストアドがautocommit = 0にして単体で呼んだ時にはrollbackできないが、 INSERT文発行した直後だとrollbackできる、のはなんで?と質問されてわけがわからないよ(◕‿‿◕)ってなったんですが、どうもMySQL(というかInnoDB)が「INSERT文を発行するときに…

load dataによるBLOB型の扱い

今回のsgtでは運良く使わなかったんだけど、万が一使うことになったときのメモ。・load data infile 文で指定することはできない(と、マニュアルには書いてあるが) ・基本的にはBinary句がついたTEXT型と同じ http://www.hi-ho.ne.jp/illusia/nif/mysql_2nd_…

MySQLトリガの制限

Oracleのように特定のカラムが更新された場合のトリガ、というのは設定することができない。(MySQL 5.5) 下行でいえば、OF [XXXX]の部分。 create trigger TRI_TEST after UPDATE OF [XXXX] on TEST for each row どこのカラムでもレコードが更新されたら強…

Oracleの波ダッシュ(〜)問題に対処する

まず、UTF-8とSJISで文字コードを変換したときに化けやすい文字、ってのがある。 http://ja.wikipedia.org/wiki/Unicode#.E6.B3.A2.E3.83.80.E3.83.83.E3.82.B7.E3.83.A5.E3.83.BB.E5.85.A8.E8.A7.92.E3.83.81.E3.83.AB.E3.83.80.E5.95.8F.E9.A1.8Cそんなか…

SELECT ... INTO で指定する変数名をカラム名と同じにすると強制的にNULLが入る

SELECT MAX_POINT INTO max_point FROM TEST WHERE id = 1; 以上のような何の変哲もないSQLだが、max_pointの値が強制的にNULLになる。 MySQLのテーブル名やカラム名は大文字小文字区別するが、 ストアドプロシージャに関しては別らしい。大はまりしました。…

InnoDB関係のパフォーマンス設定

自分用メモ。 innodb_buffer_pool_size = 120000M //適当 innodb_data_file_path = ibdata1:1G:autoextend:max:200G innodb_autoextend_increment=64 innodb_flush_method = O_DIRECT innodb_log_buffer_size = 20M innodb_flush_log_at_trx_commit = 1 // d…

ユーザにSUPER権限を与える

トリガとか設定したいときに。rootユーザで入って($mysql -u root) UPDATE mysql.user SET Super_priv='Y' WHERE user='test_user'; 確認は SELECT user, Super_priv FROM mysql.user WHERE user='test_user'; こんなかんじで。

ストアドプロシージャはsqldumpに含まれない

まあなんとなくそんな気はしてた。 別途貼りつけてやんないとダメ。

FK設定で失敗したときにエラーの詳細を確認する

MySQLが1005番というエラー番号を一律で返しやがるので。 SHOW ENGINE INNODB STATUS; で直前のFK失敗ログが見れます。メモ。

末尾スペースが無視される

全てのMySQL照合は PADSPACE タイプの物だと覚えておいてください。これは、MySQLの中の全ての CHAR と VARCHAR 値が後続スペースを無視して比較されるという事を意味します。 後続文字が剥ぎ取られたり、比較がそれらを無視する場合は、もしカラムが固有の…

CHECK制約貼った時にFK貼るとエラーになる

MySQLの文字列照合はデフォルトでignore caseなのでキー項目にはそれを防ぐためにBINARY句を付与したりしますが、CHECK制約でNOT NULLとか後から付与するとそれがなぜか外れます。(MySQL 5.5)それに気づかずにFKを貼ると文字コードが異なるのでエラーになる…

FK制約が自動生成されるはずなのに Can't create table

罠があってマニュアルだと 参照表の中では、外部キーカラムが同じ順番で first カラムとしてリストされているインデックスが存在する必要があります。もしそのようなインデックスが無ければ、自動的に参照表上に作成されます。 http://dev.mysql.com/doc/ref…

MySQLの文字列型(CHAR, VARCHAR, TEXT)は大文字小文字を区別しない(Ignore Case)

'aaa' = 'AAA' なんでPKにすると余裕でduplicate keyしたりする。すげえ。これを防ぐにはDDLで VARCHAR(20) BINARY; などとバイナリ指定しないといけない。めんどくせえー ちなみにテーブル名とかOracleは大文字小文字を区別しないのは有名だけど、 MySQLもm…

MySQLのストアドルーチンはMySQLエラーコード、エラーメッセージを取得できない

MySQLのストアドルーチン(ストアドプロシージャ、ストアドファンクション、トリガ)は Oracleで言うところのSQLCODE,SQLERRM的なエラーコード、メッセージを取得できないhttp://bugs.mysql.com/bug.php?id=11660 SQL実行したらざっくり「ストアドでエラーに…

Oracle -> MySQL SQL変換メモ

■システム日付 ・Oracle SYSDATE ・MySQL NOW()■日付型→文字列型変換(YYYY/MM/DD) ・Oracle: TO_DATE(TO_CHAR(SYSDATE), 'YY-MM-DD') ・MySQL: DATE_FORMAT( SYSDATE() , '%Y-%m-%d')■TRUNC(日付) ・Oracle TRUNC(SYSDATE) ・MySQL DATE(SYSDATE())■ADD_MONT…

下位バージョンのサーバに上位バージョンのサーバからExpすると ORA-00904: "POLTYP": invalid identifier

10gのDBサーバに11gのクライアントからEXPしたりしようとすると ORA-00904: "POLTYP": invalid identifier って出て途中でアボートする。逆(10gでexpしたものを11gにimp)とかは普通にできるので なんつーか割り切った仕様なんですかね。めんどくせえなー

トリガは値を返せない

RETURN 文は、値を返すことのできないトリガでは利用不可。すぐさまトリガから出るには、LEAVE 文を使用する。 http://dev.mysql.com/doc/refman/5.1/ja/routine-restrictions.htmlたまたまbreakみたいなRETURNだったからLEAVEで逃げれたけど、 これどうなん…

トリガを設定するとSUPER privilegeがどうこう言われる

注意:MySQL 5.1.6以前のバージョンでは、MySQL は CREATE TRIGGER を使用する為に SUPER権限を要求する http://dev.mysql.com/doc/refman/5.1/ja/create-trigger.htmlということで、5.0系だとrootユーザじゃないとトリガが設定できないようです。 え……何その…

NUMERICとDECIMALの違い

結論から言うと「ない」。 MySQL の場合、DECIMAL(M,D) 並びに NUMERIC (M,D) は同じで、両方共正確に M 桁の精度を持っています。 http://dev.mysql.com/doc/refman/5.1/ja/precision-math-decimal-changes.htmlまあなんとなくDECIMALの方が一般的に使われ…

CHAR型のカラムにスペースを含む文字列を入れるとトリムされる

mysql > CREATE TABLE hoge ( col1 char(10)) ;みたいな char(10) hoge とかのレコードに対して mysql > INSERT INTO hoge (col1) value ('0 ');としても mysql> SELECT length(col1) from hoge; +--------------+ | length(col1) | +--------------+ | 1 | …

CentOSへのMySQLdbの最低限の入れ方

最新版を最低限の手順で入れたい時に。 ネット上では色々入れ方があって混乱するのでまとめておく。・easy_install導入 # wget http://peak.telecommunity.com/dist/ez_setup.py # python ez_setup.py ・依存ライブラリ導入 # yum -y install mysql-devel py…

mysqldumpで大量のダンプデータを読み込む場合

前回、MySQLのload dataでCSVを読み込ませる場合にPKが付いてる(=インデックスがある)かどうかで、大量データの場合に死ぬほど速度差が出てくることがわかりましたが、じゃあsqldumpの場合はどうなんでしょうか。ご存知の通り、一発のINSERTで大量のデー…

load dataで読み込むCSVはソートされてる方が断然速い?

なんかそうらしいとかいう資料を見つける。 http://h50146.www5.hp.com/products/software/oe/linux/summary/mwtech/files/mysql-loaddata-v02.pdf400万件のレコードを持つデータを作ってやってみた。使ったのはSuperSmackで生成した適当なデータ。 テーブル…