としてはよくドキュメントに記載されている:彼らは概算と正確な値として格納されていない があるため
B.5.4.8 Problems with Floating-Point Values
浮動小数点数は時々混乱を引き起こします。
ローカルテストは、代替案のカップルを提示しますが、保証のない(特に第二の代替):
オルタナティブ1:
mysql> DROP TABLE IF EXISTS `tbl_test`;
Query OK, 0 rows affected (0.00 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_test` (
-> `id` FLOAT UNSIGNED AUTO_INCREMENT PRIMARY KEY
->);
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE `tbl_test`\G
*************************** 1. row ***************************
Table: tbl_test
Create Table: CREATE TABLE `tbl_test` (
`id` float unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> (`id`)
-> VALUES
-> (2233937),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (16776999),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL);
Query OK, 32 rows affected (0.00 sec)
Records: 32 Duplicates: 0 Warnings: 0
mysql> SELECT `id`,
-> CONVERT(`id`, UNSIGNED)
-> FROM `tbl_test`;
+----------+-------------------------+
| id | CONVERT(`id`, UNSIGNED) |
+----------+-------------------------+
| 2233940 | 2233937 |
| 2233940 | 2233938 |
| 2233940 | 2233939 |
| 2233940 | 2233940 |
| 2233940 | 2233941 |
| 2233940 | 2233942 |
| 2233940 | 2233943 |
| 2233940 | 2233944 |
| 2233940 | 2233945 |
| 2233950 | 2233946 |
| 2233950 | 2233947 |
| 2233950 | 2233948 |
| 2233950 | 2233949 |
| 2233950 | 2233950 |
| 2233950 | 2233951 |
| 2233950 | 2233952 |
| 16777000 | 16776999 |
| 16777000 | 16777000 |
| 16777000 | 16777001 |
| 16777000 | 16777002 |
| 16777000 | 16777003 |
| 16777000 | 16777004 |
| 16777000 | 16777005 |
| 16777000 | 16777006 |
| 16777000 | 16777007 |
| 16777000 | 16777008 |
| 16777000 | 16777009 |
| 16777000 | 16777010 |
| 16777000 | 16777011 |
| 16777000 | 16777012 |
| 16777000 | 16777013 |
| 16777000 | 16777014 |
+----------+-------------------------+
32 rows in set (0.00 sec)
例db-fiddle。
代替2:
mysql> DROP TABLE IF EXISTS `tbl_test`;
Query OK, 0 rows affected (0.01 sec)
mysql> CREATE TABLE IF NOT EXISTS `tbl_test` (
-> `id` FLOAT UNSIGNED AUTO_INCREMENT PRIMARY KEY
->);
Query OK, 0 rows affected (0.00 sec)
mysql> SHOW CREATE TABLE `tbl_test`\G
*************************** 1. row ***************************
Table: tbl_test
Create Table: CREATE TABLE `tbl_test` (
`id` float unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> INSERT INTO `tbl_test`
-> (`id`)
-> VALUES
-> (2233937),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (16776999),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL),
-> (NULL);
Query OK, 32 rows affected (0.00 sec)
Records: 32 Duplicates: 0 Warnings: 0
mysql> ALTER TABLE `tbl_test` CHANGE `id`
-> `id` FLOAT(8, 0) UNSIGNED AUTO_INCREMENT;
Query OK, 0 rows affected (0.00 sec)
Records: 0 Duplicates: 0 Warnings: 0
mysql> SHOW CREATE TABLE `tbl_test`\G
*************************** 1. row ***************************
Table: tbl_test
Create Table: CREATE TABLE `tbl_test` (
`id` float(8,0) unsigned NOT NULL AUTO_INCREMENT,
PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=16777016 DEFAULT CHARSET=latin1
1 row in set (0.00 sec)
mysql> SELECT `id`
-> FROM `tbl_test`;
+----------+
| id |
+----------+
| 2233937 |
| 2233938 |
| 2233939 |
| 2233940 |
| 2233941 |
| 2233942 |
| 2233943 |
| 2233944 |
| 2233945 |
| 2233946 |
| 2233947 |
| 2233948 |
| 2233949 |
| 2233950 |
| 2233951 |
| 2233952 |
| 16776999 |
| 16777000 |
| 16777001 |
| 16777002 |
| 16777003 |
| 16777004 |
| 16777005 |
| 16777006 |
| 16777007 |
| 16777008 |
| 16777009 |
| 16777010 |
| 16777011 |
| 16777012 |
| 16777013 |
| 16777014 |
+----------+
32 rows in set (0.00 sec)
例db-fiddle(注意が必要)。関心の
その他の情報:
なぜA_I列が浮動するのですか?それは問題を求めているだけです! – Martin
@Martin: 'AUTO_INCREMENTは整数型と浮動小数点型にのみ適用されます。 ' [13.1.17 CREATE TABLEの構文](https://dev.mysql.com/doc/refman/5.5/en/create-table.html)を参照してください。 – wchiquito
@ wchiquitoああ。私はこれにフロートを使用するのは夢中だと思うが、十分に公正な..... – Martin