10

INT 型の列を含むテーブルを作成しました。

CREATE TEMPORARY TABLE `myTab` (`int` INT, `text` TEXT, `float` FLOAT);

今、フロート値を INT 列に追加しようとしています

INSERT INTO `myTab` (`int`) VALUES (13.34);

警告が表示されません:

SHOW WARNINGS;

その後、列には13しか含まれていませんが:

SELECT * FROM `myTab`;

浮動小数点値が整数列に追加されたときに警告を受け取ることは何とか可能ですか? 私は現在使用していますmysql Ver 14.14 Distrib 5.5.31, for debian-linux-gnu (i686) using readline 6.2

追加: 各 INT 列に「ドットのチェック」を追加することは避けたいです ( MySQL で値が整数かどうかを確認するにはどうすればよいですか? )。INT へのキャスト中にデータが失われたときに警告を表示したいと思います。

4

2 に答える 2

8

DECIMAL(n, 0)の代わりに型を使用できますINT。このような列に整数以外の数値を挿入しようとすると、警告が発生します。

CREATE TEMPORARY TABLE t (id DECIMAL); -- equivalent to the default DECIMAL(10, 0), which covers the range of INT
INSERT INTO t VALUES (0.9); -- raises warning "1265 - Data truncated for column 'id' at row 1"
SELECT * FROM t; -- 0.9 was rounded to 1

これは単なる回避策であり、確かにパフォーマンスに悪影響を与えることは承知しています (おそらくマイナーですが)。しかし、これは私が思いついた唯一のアプローチの解決策です。

于 2013-05-24T14:44:10.690 に答える
4

編集:さまざまなシナリオをテストして、これに対して警告または少なくともエラーを取得しようとしましたが、運が悪かったため、意図した動作またはmysqlのバグのいずれかであると思われます(ただし、既知のバグは見つかりませんでしたこれについて説明します)したがって、最善/唯一の解決策は、によって投稿されたものだと思いますYaK

これを使って:

伝統的

MySQL を「従来の」SQL データベース システムのように動作させます。このモードの簡単な説明は、列に間違った値を挿入するときに「警告の代わりにエラーを与える」です。

set global sql_mode="TRADITIONAL";

詳細については、これをお読みください。

更新:上記の目的は、警告の代わりにエラーを取得することです。これは、警告が表示されてもデータが挿入されているため、データが破損するためですが、エラーの代わりに警告を使用したい場合は、デフォルトの sql_mode を使用する必要があります。

set global sql_mode="";

編集:警告が有効になっていることを確認してください:

set global sql_warnings=1;

my.cnfmysql の再起動時に上書きされないように、構成ファイルに追加することもできます。

ここに画像の説明を入力

于 2013-05-21T14:52:15.100 に答える