mysql:716
From: 民斗 <民斗 <tommy@xxxxxxxxxx>>
Date: Sun, 21 Feb 1999 05:31:24 +0900
Subject: [mysql 00716] Re: 登録時のチェック
民斗です。 [Subject: [mysql 00710] Re: 登録時のチェック] [Date: Fri, 19 Feb 1999 19:37:47 +0900 From:Shogo Hamamoto] > MySQLのマニュアルでは、INSERT構文の節で、 > ・NOT NULL 定義去れた項目へのNULLの挿入 > ・数値項目の範囲を超える値のセット > ・数値項目への10.34 aのような値のセット > ・CHAR、VARCHAR、TEXT、又はBLOB項目への最大長を超える文字列の挿入 > ・日付又は時刻項目への項目属性に反した挿入 > を警告レベルでは引っかけているようです。C APIのmysql_info()関数 > でチェックできるらしいのですが、 試してみたらできなくて、ドキュメント読んだりソースを追っ掛けたりして、 事前に "SET OPTOIN SQL_WARNINGS=1" をしないといけないことがわかりました。 ドキュメントの誤記? SQL_WARNINGS は 3.22.11 から追加されたみたい なんで、その頃から動作が変わったのかな…。 > 警告レベルのエラーの振舞いを変更できる命令があればいいですね。 > 警告レベルのエラーの時に、 > ・強制的に変更してでも登録するか > ・登録する場合、変更前のデータと変更後のデータをログに出すかどうか > とでもできれば良いのではないしょうか。 SET OPTION STRICT_TYPE_CHECK とかあればいいですね。 > とりあえず、現状では、 > 1.多くのデータを一辺にロードするような時 > ディスクに余裕があれば、同じ構成のチェック用のワーク > テーブルを用意して、そちらで試してからmysql_info()関数の結果を > 見る。 > 2.プログラムで1件1件書くような場合 > その度にmysql_info()関数でチェックする > というようなところでしょうか。 私は、 3. アプリケーションで事前に各項目の型に値があってるかをチェックする というのを考えてました。 でも、どれにしても2度手間ですね。やっぱりサーバがエラーにしてくれる のがベストですね。 実は、文字列項目に関しては、日本語(マルチバイト文字)固有の問題もあり ます。項目長よりも長い文字列を挿入するとき、文字列によっては、文字の 途中で切られてしまうことがあります。例えば、char(5) 項目に "日本語" を入れると "日本"+"語"の1バイト目と格納されて、その後の取り出しで プログラムによっては、文字化け等妙なことが起きる可能性があります。 エラーにしてくれれば、この問題にも対処できるんですけどね…。 -- 民斗 <tommy@xxxxxxxxxx>
703 1999-02-19 01:34 [民斗 <tommy@xxxxxxxx] 登録時のチェック 710 1999-02-19 19:37 ┗[Shogo Hamamoto <KHC0] -> 716 1999-02-21 05:31 ┗[民斗 <tommy@xxxxxxxx]