キムラデービーブログ

オープンソースデータベースを加速する「キムラデービー」のブログです。カレー日記を兼ねてます。なお著者は2010-06-01より日本オラクルに在籍していますが、本サイト(ブログ、またはウェブサイト)において示されている見解は、私自身の見解であって、オラクルの見解を必ずしも反映したものではありません。
<< チキンカツカレー@用賀CoCo壱 | main | シーフードカレー@用賀ビストロキャセロール >>
[勝手に補足]これだけは覚えておきたい!!MySQL の6つの自動変換
0
    sakaikさんの首記の記事はうまくまとまっていますが、ところどころ勘違いする人や、じゃどう対処すればいいの?と思う人がいるのではないかなー、と思いましたので勝手に補足しておきます。(単なる便乗エントリともいいますがw)

    1. [数値] 範囲外の数値は頭を押さえつけられる
    2.[数値] 小数は勝手に丸められる(warningも出ない)
    3.[数値] 数字以外が入っていると分かるところまでを登録してくれる
    4.[文字列] 長さを超えると勝手にカットされる
    5.[文字列] 「文字列連結」のつもりでうっかり + を使うな!!
    6.[日付] 年を2ケタで指定する際の変換ルール

    既存の環境を引き継ぐ時には、上記の気配りはエラーを減らしてくれるけれども、新規の開発には混乱を招くこともあるので、男はだまって次の設定をしましょう。

    mysql> SET [GLOBAL|SESSION] sql_mode='TRADITIONAL'

    いまの接続に適用したい場合は、SET SESSION〜。
    今後の接続に適用したい場合は、SET GLOBAL〜で〜。

    それにより、以下のものについてはエラーがでるようになります。

    1. 3.4.

    1.設定前
    mysql> INSERT INTO numtest VALUES (2200000000);
    Query OK, 1 row affected, 1 warning (0.02 sec)

    1.設定後。エラーがでてデータは入らない。
    mysql> SET SESSION sql_mode='TRADITIONAL';
    Query OK, 0 rows affected (0.00 sec)

    mysql> INSERT INTO numtest VALUES (2200000000);
    ERROR 1264 (22003): Out of range value for column 'a' at row 1

    3.設定後。
    mysql> INSERT INTO numtest VALUES ('12345a');
    ERROR 1265 (01000): Data truncated for column 'a' at row 1

    4.設定後
    mysql> CREATE TABLE strtest (a VARCHAR(10)) ENGINE=innodb;
    Query OK, 0 rows affected (0.02 sec)

    mysql> INSERT INTO strtest VALUES ("123456789ABCDE");
    ERROR 1406 (22001): Data too long for column 'a' at row 1

    SQLモードについては、このマニュアルをご参照ください。

    では2.はどうでしょうか? これは動作を変更することはできないはずです。MySQLに限らずほとんどのデータベースでは数値同士のキャストを暗黙的に行い代入先の範囲を超えない場合には、Warningも出しません。

    5.は独特なものですが、元々+を文字列連結演算子に使うのは
    Sybase/Microsoft SQL Serverくらい
    です。

    ちなみに文字列連結はSQL標準では||ですが、MySQLでは||がORにマップされているため通常はCONCAT()関数を利用します。

    ||をORにマップせず、文字列連結に使うにはPIPES_AS_CONCATをsql_modeに指定します。

    ちなみにOracleにもCONCAT()関数は存在しますが、引数は2個までです。
    # MySQLは可変引数で設定できます。

    6.については、まぁ各DB様々ですのでMySQLに限った話ではありません。素直に省略せずに書きましょう。

    さて、最後に「6つの」というのは座りが悪いので、七個目をこれまた勝手に追加しておきましょう。

    7.[文字列] 知らない漢字以降は勝手にカットされる
    例えばMySQL 5.1/5.5のUTF8(3-byteまで)に対して、サロゲートペア(4-byte)の文字を入れようとすると、その文字だけでなく、それ以降の文字もカットされます。

    mysql> CREATE TABLE t1 (c1 VARCHAR(30)) CHARSET utf8;
    Query OK, 0 rows affected (0.01 sec)

    mysql> -- "abc" + 4byte UTF-8(0xF0909080) + "def"
    mysql> INSERT INTO t1 VALUES(0x616263F0909080646566);
    Query OK, 1 row affected, 1 warning (0.02 sec)

    mysql> -- "def" is truncated
    mysql> SELECT C1 FROM t1;
    +------+
    | C1 |
    +------+
    | abc |
    +------+
    1 row in set (0.00 sec)

    このように中途半端にデータが入ることを防ぐためには、冒頭で述べたようにSQL_MODEを設定します。

    mysql> SET SESSION SQL_MODE='TRADITIONAL';
    Query OK, 0 rows affected (0.00 sec)

    mysql> INSERT INTO t1 VALUES(0x616263F0909080646566);
    ERROR 1366 (HY000): Incorrect string value: '¥xF0¥x90¥x90¥x80de...' for column 'c1' at row 1

    現状、これを防ぐためには文字列をバイナリ列として格納する(MySQL5.1/5.5)もしくは、MySQL6.0のサロゲートペア対応のキャラクタセットを利用するしかありません。詳細については、以下の松信さんの資料をご参照ください。

    MySQL日本語問題洗い出し (2008.6 OSC.DB)

    それでは、また!

    [2010-03-04 追記]
    本家のほうに、補足記事がでました。いろいろと先走って補足してすまねえっす。

    [mysql]MySQLの自動変換を丁重にお断りするためのたった1種類の呪文
    | meijik | MySQL | 23:19 | comments(0) | trackbacks(0) | - | - |









    トラックバック機能は終了しました。
       1234
    567891011
    12131415161718
    19202122232425
    262728293031 
    << January 2020 >>
    + RECOMMEND
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊
    100人のプロが選んだソフトウェア開発の名著 君のために選んだ1冊 (JUGEMレビュー »)

    100人のうちの一人としてミックさんの本を推薦しています。
    + RECOMMEND
    MySQL 5.1 Plugin Development
    MySQL 5.1 Plugin Development (JUGEMレビュー »)
    Andrew Hutchings,Sergei Golubchik
    MySQL 5.1 のプラグインを作るならこれ!
    + RECOMMEND
    AWKを256倍使うための本 (Ascii 256倍)
    AWKを256倍使うための本 (Ascii 256倍) (JUGEMレビュー »)
    志村 拓,鷲北 賢,西村 克信
    ここにきてまさかの復刊。15〜16年前の本ですが、いまでも十分役立ちますよ!!
    + RECOMMEND
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION)
    Linux-DB システム構築/運用入門 (DB Magazine SELECTION) (JUGEMレビュー »)
    松信 嘉範
    Linux-DB システム構築の新スタンダード。DB Magazine人気連載、待望の書籍化です!!
    + RECOMMEND
    + RECOMMEND
    超・極める!MySQL
    超・極める!MySQL (JUGEMレビュー »)
    坂井 恵,志村 和彦,ひろせ まさあき,松信 嘉範
    内容は少々古くなりましたが、内部説明があり、いろいろ面白いです。
    + RECOMMEND
    The Root of .NET Framework
    The Root of .NET Framework (JUGEMレビュー »)
    荒井 省三
    .NETの根っこをつかむ、か?
    + RECOMMEND
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド
    エキスパートのためのMySQL[運用+管理]トラブルシューティングガイド (JUGEMレビュー »)
    奥野 幹也
    これまでにない構築、そして構築後のMySQLのための本。
    + RECOMMEND
    Database Management Systems
    Database Management Systems (JUGEMレビュー »)
    Raghu Ramakrishnan,Johannes Gehrke
    ミックさん連載の参考書籍です。
    + RECOMMEND
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series)
    Advanced Programming in the UNIX Environment: Paperback Edition (2nd Edition) (Addison-Wesley Professional Computing Series) (JUGEMレビュー »)
    W. Richard Stevens,Stephen A. Rago
    必読! といいつつ私が読んだのは初版の日本語訳です。差分はチェックしないといけませんね。
    + RECOMMEND
    + RECOMMEND
    + RECOMMEND
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE
    Western Digital Scorpio Blue 2.5inch 5400rpm 320GB 8MB PATA WD3200BEVE (JUGEMレビュー »)

    DELL SX260の換装用に購入。今はコチラのほうが安いですね。
    + RECOMMEND
    情熱プログラマー ソフトウェア開発者の幸せな生き方
    情熱プログラマー ソフトウェア開発者の幸せな生き方 (JUGEMレビュー »)
    Chad Fowler
    OSC2010神戸に出展されたジュンク堂で買いました。
    + RECOMMEND
    Software Design 総集編 【2000~2009】(DVD付)
    Software Design 総集編 【2000~2009】(DVD付) (JUGEMレビュー »)

    メガトン級の過去記事。売り切れる前にお店に急げ!
    + RECOMMEND
    + RECOMMEND
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2
    玄人志向 2.5型HDDケース SATA対応USB2.0接続 GW2.5AI-SU2 (JUGEMレビュー »)

    Aspire 1410 HDD換装後、昔のHDDはこれにいれます。
    + RECOMMEND
    + RECOMMEND
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22
    acer Aspire Timeline AS1410 11.6型ノートPC Windows7搭載 250GB ブラック AS1410-KK22 (JUGEMレビュー »)

    色違い黒(他に青と白があります): メモリは最大4GBとあるが、がんばれば8GBいけるらしい。
    + RECOMMEND
    Firebird 徹底入門
    Firebird 徹底入門 (JUGEMレビュー »)
    木村 明治,はやし つとむ,坂井 恵
    Firebird日本ユーザ会のはやしさん、そしてMyNAから拝借(?) してきた坂井さんとともに書きました。まだ誰も知らないFirebird 2.5や、いままでドキュメントのなかったツール類についてもソースを確認してとりあげた本です。是非ご活用ください。
    + SELECTED ENTRIES
    + RECENT COMMENTS
    • たまたま「プリントヘッドの種類が違います」エラーから復活@MG6230
      meijik (11/20)
    • [ミュージシャンに聴かせたい・弾かせたい!] (4) 山田元気様
      meijik (07/27)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (03/03)
    • 2019年の木村明治
      田中尚 (01/08)
    • 使い慣れたSQLに潜む実装依存: Firebirdの場合(6) 文字列との結合演算子
      noname (12/10)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      Moriaki_ (01/05)
    • 2015年版 InterBaseの歩み
      nakagami (12/06)
    • 毎月日経SYSTEMSが届くたびに?が増え続ける: 日経SYSTEMSのコラム「ITアーキテクチャーの真髄」と「第7正規化」
      meijik (11/22)
    • 分散DB本読書会第46回メモ「STOP AFTER 10」
      masudahidehiko (09/01)
    + RECENT TRACKBACK
    + CATEGORIES
    + ARCHIVES
    + MOBILE
    qrcode
    + LINKS
    + PROFILE