HHeLiBeXの日記 正道編

日々の記憶の記録とメモ‥

MySQL

トリガーを駆使して登録日時と更新日時を両方管理する

駆使して、ってほど複雑なことは全然ないんだけど、たまたまそんなトリガーを書いたのでメモ。 以前に、MySQLで自動更新のTIMESTAMP型の列を2つ以上定義できないということを書いたこともついでに思い出した(謎)。 TIMESTAMP型の位置づけ - HHeLiBeXの日記 …

collation(照合順序)衝突の問題

MySQLで、以下のようなエラーに悩まされたことはないだろうか。 ERROR 1267 (HY000): Illegal mix of collations (sjis_japanese_ci,IMPLICIT) and (cp932_japanese_ci,IMPLICIT) for operation 'UNION' ERROR 1267 (HY000): Illegal mix of collations (sji…

キーの最大長と文字エンコーディング設定

今までsjisとかujisとかだったMySQLのデータベースをutf8mb4に変換しようとしていたときの話。キーの最大長という壁にぶつかったらしい。 http://d.hatena.ne.jp/takihiro/20080306/1219295452 MySQLのリファレンスを見ると、こんなことが書いてある。 プレ…

識別子の大文字と小文字の違い(2)

あの頃(何時)はまだMySQLに関する知識がなかった‥ 識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編 で、MySQLでは、列名などの識別子はバッククォートで括るらしい(ということを、「show create table hoge」を実行して気づいたらしい)。 ということ…

データベースの文字エンコーディングを変更する

データベースの文字エンコーディングを変更する、と言っても、「設定ファイルを編集してデフォルトの文字エンコーディングを変更しよう!」などというちゃちな話ではない。(「MySQL 文字コード 変更」で探すとそんな話ばかりがヒットして‥もうね、ばくh(以下…

SQLExceptionから取得できるSQLSTATEとエラーコード

ふとjava.sql.SQLExceptionのJavaDocを見ていたら、SQLSTATEとベンダー固有のエラーコードを取得できることに(いまさら)気づいた。 ベンダー固有のエラーコードはログに吐き出すくらいしか用途を思いつかないが、SQLSTATEはある程度規格化されているはずなの…

JavaプログラムからMySQLに4バイトのUTF-8文字を放り込んでみる

前の記事で、PHPプログラムからMySQLに4バイトのUTF-8文字を放り込んでみた。 MySQLで4バイトのUTF-8文字を扱ってみる - HHeLiBeXの日記 正道編 ついでなので、Javaプログラムの場合はどうなるのかを調べてみた。 例のごとく、「𠮟」と書かれた部分は「叱」…

MySQLで4バイトのUTF-8文字を扱ってみる

JIS X 0213:2004で追加された「叱」の異体字は、Unicodeにおいては「UTF-8で符号化すると4バイトになる」コードが割り当てられている。また、中国語をまともに扱おうと思ったら「UTF-8で4バイト」の文字を扱う必要が出てくる。 そんな文字どもをMySQLデータ…

LIMITの限界に挑戦

以下のエントリで、各構文のサポート状況について書いた。 指定した範囲の行を取得するクエリ - HHeLiBeXの日記 正道編 この中のLIMIT/OFFSETで不思議な挙動を示したものがあったり、どこまでいけるんだろうと思ったりしたので、調子に乗って(謎)、LIMITに指…

指定した範囲の行を取得するクエリ

DB2 Express-C v9.7.2のWindows版で使えていたLIMIT/OFFSETが同Linux版で使えなくて、プラットフォームによって違うのかと思ってしまい、同等のことができる構文をいろいろと調べた挙句、インストール直後の設定が違っていただけという。 で、せっかくなので…

文字列型とマルチバイト文字

MySQLで、何も考えずに「VARCHAR(n)」な列に日本語n文字を格納しようとしたら格納できてしまい、DB2での記憶と違うということで一通り調べてみたらしい。作ったテーブルは次のとおり。 CREATE TABLE tbl1(str CHAR(6) NOT NULL) CREATE TABLE tbl2(str NCHAR…

テーブル名や列名の別名の指定

はじめに - SQL標準規格では SQL標準規格によると、SQL文ではテーブル名や列名の別名を次のように指定することができることになっている。(いずれも、キーワード AS は省略可能) SELECT t.col2 [AS] c2 FROM tbl [AS] t WHERE t.col1 = 1 UPDATE tbl [AS] t …

AutoCommitの動作を誤解していた訳

以下の続き。 SET AUTOCOMMIT=0後の動作を誤解していたらしいの巻 - HHeLiBeXの日記 正道編 そもそもJDBCでは、トランザクション処理を書くときに、次のいずれかの書き方をすることになる: // TODO エラー処理 Connection connection = DriverManager.getCo…

SET AUTOCOMMIT=0後の動作を誤解していたらしいの巻

PHP+MySQL環境でmysql_pconnect関数を使っていて、謎な挙動に悩まされていたらしいが、その原因が「SET AUTOCOMMIT=0」にあるらしいということで。実は、問題が浮上して調査するまでは「SET AUTOCOMMIT=0」が問題だとは微塵も思っていなかった。なので、「SE…

トランザクションを強制的に終了させる

前置き MySQL 5.1で、InnoDBなデータベースを使って何かを開発している最中には、トランザクションがコミット(またはロールバック)される前にプログラム側の処理が(Fatal errorなどで)異常終了したりして、トランザクションがロックを取得したまま放置状態に…

DBMSへのクエリの結果をキャッシュすることについて考えてみる

MySQL(実はPostgreSQLもだが)を使った開発(何)で、memcachedにクエリの結果をキャッシュするという要件があるのだが(謎)、ちょっと考えてみても、いろいろと考察しないといけないことがあるよなぁ、と思ったので、ちょっと考えてみる。 一口にキャッシュする…

文字列を格納する列の定義

MySQLユーザー(何)には常識なのだろうが、ほかのDBMSに慣れてからMySQLを使い始めた人がはまりそうなポイント。(そもそも自分がこれに気づいたのは、とあるSQL文を見たから(謎))それは次の2つのCREATE TABLE文の違い。 CREATE TABLE hoge1(v VARCHAR(8)) ; C…

TIMESTAMP型の位置づけ

知っている人は知っている、というお話(だと思う)。以前に、Microsoft SQL ServerでTIMESTAMP型の列にsetTimestampできないというのをどこかで読んでからずっと引っかかっていたこと。(参照:メモ: SQL Server の timestamp 型に insert すると Disallowed i…

文字列の連結

SQLにおける文字列連結は「縦棒2本(||)」という自分の中の常識が打ち破られたらしい。 ということで、次のテーブルを前提として調査してみた。 CREATE TABLE hoge( v1 VARCHAR(4) NOT NULL , v2 VARCHAR(4) NOT NULL , v3 VARCHAR(4) NOT NULL , v4 VARCHAR(…

列名を持たない列の列名(意味不明)

なんと言えばいいのか分からなかったので意味不明なタイトルになったが、要は次のようなクエリを実行したときの結果表の列名はどうなるのか、ということ。 SELECT COUNT(*) FROM hoge ということで、一通り調べてみた。 次のテーブルを前提とする。 CREATE T…

xx_fetch_array()関数の恐怖

いや、まぁ恐怖ってほどのことでもないのだけど。 こんなクエリ(何)書かないだろうし。 select table_schema as "1", table_name as "2", column_name as "3" from information_schema.columns where table_schema = 'information_schema' and table_name = …

MySQL接続設定 - PHP実行環境改変メモ(2)

引き続き、自宅のPCのPHP環境の改変。 PHP実行環境構築メモ - HHeLiBeXの日記 正道編 PHP実行環境改変メモ - HHeLiBeXの日記 正道編 ためしにMySQLに接続してみる これまでと同様に、"php.ini"の次の行のコメントをはずす(963行目辺り)。 ;extension=php_mys…

各DBMSで日付型の値から曜日を取り出す

最初、PostgreSQLでdate_part関数を使用している処理があって、それをMySQLではどう書けばいいかというのを調べたことから始まったのだが。 手始めに次のブログを見つけた。 馬場誠Blog(東京都世田谷区経堂のWebクリエイター)» ブログアーカイブ » MySQLで…

MySQLでidentity column

以前に書いたidentity columnに関する記事(identity column - テーブルの各行にシーケンス番号を割り当てる - HHeLiBeXの日記 正道編)のMySQL版。 AUTO_INCREMENTというのを列定義に指定すればいいらしい。 http://dev.mysql.com/doc/refman/4.1/ja/example-…

TIMESTAMP のリテラル

TIMESTAMP のリテラルを記述する際に、DB2 で苦労した記憶が唐突によみがえってきたので、手元にある DBMS を比べてみた。 IBM DB2 Express-C v9.1.2 IBM DB2 Express-C v9.5.2 IBM DB2 Express-C v9.7.0 Oracle Database 10g Express Edition PostgreSQL v8…

情報スキーマ-列名の取得

以下のエントリで、識別子の大文字/小文字について触れた。 識別子の大文字と小文字の違い - HHeLiBeXの日記 正道編 で、列名の情報がどう格納されているのかについてまとめてみる。 実行してみるクエリは、各DBMSについて以下のようなものになる。 表の生成…

SQLの比較演算子

唐突に、「プログラム言語を学んだ後でSQLを学ぶと、"not equal"を"!="と書きたくなる人が多いんじゃないか」、「SQLでは"<>"」と考えたところで、どこかの実装で"!="が使えたものがあったような記憶がよみがえってきた。 そこで、次の本を参照してみた。SQL…