0

システムのバグを探していたときに、この奇妙な動作に遭遇しました。以下を検討してください。

varchar(100)列を持つmysqlテーブルがあります。次のSQLスクリプトを参照してください。

create table user(`id` bigint(20) NOT NULL AUTO_INCREMENT,`user_id` varchar(100) NOT NULL,`username` varchar(255) DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `user_id` (`user_id`))  ENGINE=InnoDB AUTO_INCREMENT=129 DEFAULT CHARSET=latin1;

insert into user(user_id, username) values('20120723145614834', 'user1');

insert into user(user_id, username) values('20120723151128642', 'user1');

次のクエリを実行すると、0件の結果が返されました。

select * from user where user_id=20120723145614834;

しかし、以下を実行すると、結果が得られます(一重引用符に注意してください)。

select * from user where user_id='20120723145614834';

user_idフィールドはvarcharであるため、これは予想されます。奇妙なことに、次の両方のクエリで結果が得られます。

select * from user where user_id=20120723151128642;
select * from user where user_id='20120723151128642';

誰かがこの奇妙な行動の理由を私に説明できますか?私のMySqlバージョンは5.1.63-0ubuntu0.11.10.1です

4

1 に答える 1

1

mysqlドキュメント12.2を確認してください。式評価における型変換

浮動小数点数(または浮動小数点数に変換される値)を使用する比較は、そのような数値が不正確であるため、概算です。これにより、結果に一貫性がないように見える場合があります。

mysql> SELECT '18015376320243458' = 18015376320243458;
        -> 1
mysql> SELECT '18015376320243459' = 18015376320243459;
        -> 0

したがって、SQLには常に正しいデータ型を使用する方が適切です。

于 2012-07-27T06:08:09.650 に答える