[前][次][番号順一覧][スレッド一覧]

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]