2009-10-06 41 views
27

Tôi có một trường, justsomenum, kiểu thập phân (3,2) trong MySQL có vẻ luôn có giá trị 9,99 khi tôi chèn thứ gì đó như 78,3. Tại sao?Giá trị thập phân (3,2) trong MySQL luôn là 9,99

Đây là những gì bàn của tôi trông giống như:

mysql> describe testtable; 
+---------------+--------------+------+-----+---------+----------------+ 
| Field   | Type   | Null | Key | Default | Extra   | 
+---------------+--------------+------+-----+---------+----------------+ 
| id   | int(11)  | NO | PRI | NULL | auto_increment | 
| firstname  | varchar(20) | YES |  | NULL |    | 
| lastname  | varchar(20) | YES |  | NULL |    | 
| justsomenum | decimal(3,2) | YES |  | NULL |    | 
+---------------+--------------+------+-----+---------+----------------+ 

Khi tôi chèn một cái gì đó như thế này và chọn:

mysql> insert into testtable (firstname, lastname, justsomenum) values ("Lloyd", "Christmas", 83.5); 

tôi nhận được 9,99 khi tôi chọn.

mysql> select * from testtable; 
+----+-----------+-----------+---------------+ 
| id | firstname | lastname | justsomenum | 
+----+-----------+-----------+---------------+ 
| 1 | Shooter | McGavin |   9.99 | 
| 2 | Lloyd  | Christmas |   9.99 | 
| 3 | Lloyd  | Christmas |   9.99 | 
| 4 | Lloyd  | Christmas |   9.99 | 
+----+-----------+-----------+---------------+ 
4 rows in set (0.00 sec) 

Đây là MySQL 5.0.86 trên Mac OS X 10.5.8.

Bất kỳ ý tưởng nào? Cảm ơn.

+3

+ upvote để thực sự cung cấp lược đồ và truy vấn, không phải thứ bạn thường thấy :) –

+0

Một tính năng hay khác của MySQL - âm thầm sửa đổi dữ liệu của bạn để chèn không thành công ... –

Trả lời

51

Giá trị tối đa cho decimal(3, 2) là 9,99, vì vậy khi bạn cố gắng chèn thứ gì đó lớn hơn, nó được giới hạn ở mức 9,99. Hãy thử decimal(5, 2) hoặc thứ gì đó khác nếu bạn muốn lưu trữ số lớn hơn.

Đối số đầu tiên là tổng số chữ số chính xác và đối số thứ hai là số chữ số sau dấu thập phân.

+1

Cảm ơn sự giúp đỡ. Tôi lấy số thập phân (m, d) có nghĩa là bất kể giá trị nào, tôi có thể đặt m ở bên trái của số thập phân và d ở bên phải của số thập phân. – labratmatt

16

Trong các phiên bản cũ MySQL DECIMAL (3.2) có nghĩa là 3 số nguyên bên trái DP và 2 ở bên phải.

Các nhà phát triển MySQL đã thay đổi nó để thuộc tính đầu tiên (trong trường hợp này là '3') là số nguyên đầy đủ trong số thập phân (9,99 là ba số) và thuộc tính thứ hai (trong trường hợp này là '2') vẫn giữ nguyên - số vị trí thập phân.

Hơi khó hiểu một chút. Về cơ bản, đối với các trường DECIMAL, bất kỳ số nguyên nào bạn muốn trước khi DP cần phải là được thêm vào bất kỳ số nguyên nào bạn muốn sau DP và đặt làm tùy chọn đầu tiên của bạn.

Sau đó, như đã được nói, nếu bạn cố gắng nhập một số lớn hơn giá trị tối đa cho trường, MySQL sẽ tìm cho bạn. Vấn đề ở đây là cấu hình MySQL của bạn. Tôi đi vào chi tiết hơn về điều này on my blog.

+0

Tốt phá vỡ, scrumpyjack. Tại sao MySQL thực hiện thay đổi này trong quy ước là ngoài tôi. Tôi cho rằng tôi sẽ google nó một ngày. – micahwittman

+0

đề cập đến quy tắc phiên bản cũ thực sự tuyệt vời vì ai đó có thể gặp phải nó ở đâu đó chỉ để bị lừa dối trong thời gian để khám phá nó sau này trong một sự ngạc nhiên thất vọng. –

Các vấn đề liên quan