2010年4月22日

[mysql 15280] Re: MySQL5.1DATE型項目の制限について


 坂井さん

 鈴木です

 申し訳有りません。
 私が誤った返信をしたばかりに・・・
 更に深堀りを強いてしまいました


 先程 mysql> select @@sql_mode; の結果が空白だったと返信しましたが、
 慌てた私の誤りで旧バージョンのMySQLで実行した結果でした。

 新バージョンのMySQL5.1.45(64)では、ちゃんと
 STRICT_TRANS_TABLES,NO_AUTO_CREATE_USER,NO_ENGINE_SUBSTITUTION
 と表示され STRICT_TRANS_TABLESを外す事で
 問題無く空白の代入が可能となりました

 本当にありがとうございました

>坂井です
>
>>>鈴木さん
>
> 「エラーになる」のが MySQL のエラーだとしたら、STRICTモードに
> なっているのだと思いますが、考えられるのとしては以下2つあります。
>
> 1)その「WEBベースのシステム」内で接続時にSTRICTモードを指定
> している(前のメールを書いた時にはサーバオプションの設定で
> STRICT_ALL_TABLES していると考えていましたが、このオプショ
> ンは接続ごとにも指定可能なのです)
> そのシステムの接続ルーチンを通過させて select @@sql_mode
> の実行させるようなサンプルを作ることができれば、それで
> 確認してみると分かります。
>
> 2)その「WEBベースのシステム」内で、MySQLからWarningが帰って
> 来た場合でも「エラー」として扱っている
> (この場合、warningは出つつも 0000-00-00 なデータは登録さ
> れるので、""を登録しようとして「エラー」が出た後でのテー
> ブルへの登録状況確認すれば切り分けができます)
>
>
> 手前味噌ですが値の切り捨てやsql_mode については以前以下の
> エントリを書いたので、参考になれば幸いです。
> http://d.hatena.ne.jp/sakaik/20100303/mysqlmode
>
> それから、
>
>>  ストリクトモード時に無効なデータを入れたい場合は、
>>  INSERT IGNOREまたはUPDATE IGNOREを指定する。
>
> との事ですが、今回(今の時点での確認内容では)
> ストリクトモードで動作しているという確認が取れていないので
> 前提条件が合わない「結果オーライ」になっちゃいます。
> 「INSERT IGNORE でうまく行ったから、きっとストリクトモード
> で動いているのだろう」という推測はできますが:-)
> 上位 1) の方法などで「ストリクトモードである」ことの確認が
> 取れれば、 a)そのモードをやめる(理由があって指定しているの
> でしょうから難しいかもしれませんが) b) INSERT IGNORE にする
> c) 日付に "" を与えるのをやめる
> などの対応が考えられますね。
>
>
>thank you
>On Thu, 22 Apr 2010 12:14:06 +0900
>KDDI 鈴木 正信 <masanobu@xxxxx> wrote:
>>
>>  坂井さん
>>
>>  鈴木です 
>>  早速のご教示ありがとうございます。
>>  SQL_MODEって初めて知り勉強になりました。
>>
>>  すぐに試したのですが結果は↓と同じ空欄表示でした。
>>
>> >mysql> select @@sql_mode;
>> >+------------+
>> >| @@sql_mode |
>> >+------------+
>> >| |
>> >+------------+
>>
>>  SQL_MODEを手懸りにNETを検索すると、
>> http://www.hirohama.biz/mysql/2007/06/22-100644.html
>>  ストリクトモード時に無効なデータを入れたい場合は、
>>  INSERT IGNOREまたはUPDATE IGNOREを指定する。
>>
>>  という記述があり試して見るとうまく行きました。
>>  これなら改修も小規模で済みそうです。(嬉)
>>
>>  今回の件は、これがベターな解でしょうか?
>>  もっと簡単な方法があれば引き続き皆様の
>>  お知恵を頂ければ有り難いです。
>>
>>
>> >坂井です
>> >
>> > 鈴木さん、こんにちは。
>> > 5.1でも 日付型への "" は truncate されて 0000-00-00 として
>> > 登録されると思いますが(warning は出る)、エラーになるという
>> > ことで、何かSQLモードを設定されていませんか?
>> > SELECT @@SQL_MODE; で確認可能です。
>> > SQL_MODE として STRICT_ALL_TABLES が指定されていると warning
>> > ではなくエラーになります。
>> >
>> >実行サンプル
>> >----
>> >mysql> create table a (id int, dt date);
>> >mysql> insert into a values (1, "0000-00-00");
>> >
>> >mysql> insert into a values (2, "");
>> >Query OK, 1 row affected, 1 warning (0.00 sec)
>> >
>> >mysql> show warnings;
>> >+---------+------+-----------------------------------------+
>> >| Level | Code | Message |
>> >+---------+------+-----------------------------------------+
>> >| Warning | 1265 | Data truncated for column 'dt' at row 1 |
>> >+---------+------+-----------------------------------------+
>> >
>> >mysql> select * from a;
>> >+------+------------+
>> >| id | dt |
>> >+------+------------+
>> >| 1 | 0000-00-00 |
>> >| 2 | 0000-00-00 |
>> >+------+------------+
>> >
>> >
>> >mysql> select @@sql_mode;
>> >+------------+
>> >| @@sql_mode |
>> >+------------+
>> >| |
>> >+------------+
>> >
>> >mysql> set sql_mode='STRICT_ALL_TABLES';
>> >
>> >mysql> insert into a values (3, "");
>> >ERROR 1292 (22007): Incorrect date value: '' for column 'dt' at row 1
>> >
>> >------
>> >
>> >Thank you
>> >
>> >On Thu, 22 Apr 2010 11:12:04 +0900
>> >KDDI 鈴木 正信 <masanobu@xxxxx> wrote:
>> >>
>> >> こんにちは 鈴木と申します
>> >>
>> >> Windows版 MySQL4.1.7(32) で動かしているWEBベースのシステムを
>> >> Windows版 MySQL5.1.45(64) に載せ変える為のTEST作業を行っていますが
>> >>
>> >> MySQL4.1.7では許容されていた DATE型項目への
>> >> 空白の代入が、MySQL5.1.45ではエラーになります
>> >> (null や '0000-00-00' はOK)
>> >>
>> >> 空白を'0000-00-00'に変換するとなると
>> >> 改修規模が膨れ上がるので、うろたえています・・・
>> >> 空白の代入を許す方法は無いものでしょうか?
>> >>
>> >> 何かご存知の方に解決の糸口をアドバイス頂ければ
>> >> と思い投稿致しました。何卒宜しくお願い致します。
>> >
>> >--
>> >SAKAI Kei <sak2@xxxxx>
>> >
>> >
>> >
>>
>> 0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----#
>> KDDI ブロードバンド・コンシューマ業務推進部
>> 総務管理G
>>     鈴木 正信
>> au 080-5072-9414
>> mailto:masanobu@xxxxx
>> ――――――――――――――――――――――――
>>  *******************************************************
>> 【注意】この電子メールには、KDDI株式会社の機密情報が
>> 含まれている場合が有ります。
>> 正式なメール受信者で無い場合は、メールの複製、再配信
>> または情報の使用を固く禁じております。
>> エラー、手違いでこのメールを受け取られましたら、削除
>> を行い配信者にご連絡をお願い致します。
>>  *******************************************************
>
>--
>SAKAI Kei <sak2@xxxxx>
>
>
>

0----+----1----+----2----+----3----+----4----+----5----+----6----+----7----#
KDDI ブロードバンド・コンシューマ業務推進部
総務管理G
    鈴木 正信
au 080-5072-9414
mailto:masanobu@xxxxx
――――――――――――――――――――――――
 *******************************************************
【注意】この電子メールには、KDDI株式会社の機密情報が
含まれている場合が有ります。
正式なメール受信者で無い場合は、メールの複製、再配信
または情報の使用を固く禁じております。
エラー、手違いでこのメールを受け取られましたら、削除
を行い配信者にご連絡をお願い致します。
 *******************************************************


投稿者 xml-rpc : 2010年4月22日 12:57
役に立ちました?:
過去のフィードバック 平均:(0) 総合:(0) 投票回数:(0)
本記事へのTrackback: http://hoop.euqset.org/blog/mt-tb2006.cgi/95269
トラックバック
コメント
コメントする




画像の中に見える文字を入力してください。