mysql で 2 つの符号なしの値を減算すると、結果も符号なしになります。5.5.5 以降、結果が負の場合、mysql はエラーをスローします。
ただし、私の場合は、否定的な結果が必要です。これは sql_mode='NO_UNSIGNED_SUBTRACTION' を設定することで実現できることをすでに学びました。
次の表を見てください。
DROP TABLE IF EXISTS `test`;
CREATE TABLE `test` (
`s` INT SIGNED,
`u1` INT UNSIGNED,
`u2` INT UNSIGNED
);
INSERT INTO `test` VALUES (-1, 0, 1);
SET sql_mode='NO_UNSIGNED_SUBTRACTION';
SELECT `u1` - `u2` FROM `test`;
SELECT の結果は、意図したとおり -1 です。しかし、もしそうなら、
SELECT `s` + `u1` FROM `test`;
これは数学的には同じですが、「BIGINT UNSIGNED 値が範囲外です」というエラーが表示されます (mysql 5.5.29 でテスト済み)。
これは、符号なしの値をキャストすることで修正できることはわかっていますが、影響を受けるすべてのクエリを変更する必要がない、減算のようなグローバルなソリューションがあるかどうかを知りたいです。
結局のところ、なぜこの負の値の追加が NO_UNSIGNED_SUBTRACTION でカバーされないのだろうか。これは意図したものですか、それともバグですか?