Làm thế nào để sử dụng MySQL DECIMAL?


177

Tôi hoàn toàn không thể nắm bắt được KHAI THÁC của MySQL. Tôi cần hàng để có thể chứa một số ở bất cứ đâu từ 00.0001 đến 99.9999. Làm thế nào tôi có thể cấu trúc nó để làm việc như vậy?



4
Bạn nên thực sự chấp nhận câu trả lời chính xác. Câu trả lời hiện được chấp nhận là sai.
Olhovsky

2
Đã kết thúc ở đây và đọc câu trả lời tuyên bố rằng KHÔNG THỂ CHẤP NHẬN không thể thực hiện được. Xem câu trả lời mới dưới đây để biết thông số chính xác cho việc này.
Markus AO

Câu trả lời:


439

Các cột NHÂN ĐÔI không giống như các cột DECIMAL và bạn sẽ gặp rắc rối nếu bạn sử dụng các cột NHÂN ĐÔI cho dữ liệu tài chính.

NHÂN ĐÔI thực sự chỉ là một phiên bản FLOAT chính xác kép (64 bit thay vì 32 bit) . Số dấu phẩy động là biểu diễn gần đúng của số thực và chúng không chính xác. Trên thực tế, các số đơn giản như 0,01 không có biểu diễn chính xác trong các loại FLOAT hoặc NHÂN ĐÔI.

Các cột DECIMAL là các biểu diễn chính xác, nhưng chúng chiếm nhiều không gian hơn cho một phạm vi số nhỏ hơn có thể có. Để tạo một cột có khả năng giữ các giá trị từ 0,0001 đến 99,9999 như bạn đã hỏi, bạn sẽ cần câu lệnh sau

CREATE TABLE your_table
(
    your_column DECIMAL(6,4) NOT NULL
);

Định nghĩa cột tuân theo định dạng DECIMAL (M, D) trong đó M là số chữ số tối đa ( độ chính xác ) và D là số chữ số ở bên phải dấu thập phân ( thang đo ).

Điều này có nghĩa là lệnh trước đó tạo một cột chấp nhận các giá trị từ -99.9999 đến 99.9999. Bạn cũng có thể tạo một cột KHAI THÁC KHÔNG ĐƯỢC KÝ, từ 0,0000 đến 99,9999.

Để biết thêm thông tin về MySQL DECIMAL các tài liệu chính thức luôn là một tài nguyên tuyệt vời.

Hãy nhớ rằng tất cả các thông tin này là đúng cho các phiên bản MySQL 5.0.3 trở lên. Nếu bạn đang sử dụng các phiên bản trước, bạn thực sự nên nâng cấp.


17
Bình chọn câu trả lời của bạn. Câu trả lời của bạn là chính xác, câu trả lời khác là không (vì nó tuyên bố rằng "double = binary"). DECIMAL là một loại điểm cố định có giá trị chính xác và các từ đồng nghĩa của nó là NUMERIC, DEC và CỐ ĐỊNH. Không phải NHÂN ĐÔI, vì NHÂN ĐÔI là loại dấu phẩy động đại diện cho các giá trị dữ liệu số gần đúng. Khi sử dụng DECIMAL (<1-65>, <0-30>), tham số đầu tiên là số chữ số, số thứ hai là số chữ số ở bên phải dấu thập phân.
Norbert

2
Vâng, bạn đúng. Hãy lưu ý rằng đó là công việc cho MySQL 5.0.3 trở đi, dev.mysql.com/doc/refman/5.1/en/precision-math-examples.html
ajreal

1
Người đăng yêu cầu một trường thập phân giữ các giá trị trong khoảng từ 0,0001 đến 99,9999. Tôi đã thêm một số thông tin bổ sung để làm rõ rằng trường được tạo thực sự hỗ trợ các giá trị từ -99.9999 đến 99.9999. Cảm ơn vì bạn đã phản hồi! Cũng thêm từ chối phiên bản MySQL.
Alex Recarey

1
Bạn đã nói "Không có cách nào để tạo một cột DECIMAL" không dấu ", tuy nhiên ví dụ mã của bạn cho biết" DECIMAL (6,4) KHÔNG ĐƯỢC ĐĂNG KÝ KHÔNG PHẢI ". Tại sao lại thế này?
liang

3
@AlexRecarey Tôi dường như có thể tạo ra một QUYẾT ĐỊNH KHÔNG ĐƯỢC CHẤP NHẬN tốt; và hướng dẫn cho MySQL 5.x đồng ý : DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL]. Nó sẽ trả về một lỗi ngoài phạm vi cho các giá trị âm. Bạn cũng có thể tạo FLOAT và NHÂN ĐÔI không dấu. Hướng dẫn sử dụng: dev.mysql.com/doc/refman/5.0/en/numeric-type-overview.html
Markus AO

66

Mặc dù các câu trả lời ở trên có vẻ đúng, chỉ là một lời giải thích đơn giản để cung cấp cho bạn ý tưởng về cách thức hoạt động của nó.

Giả sử rằng cột của bạn được đặt thành DECIMAL(13,4) . Điều này có nghĩa là cột sẽ có tổng kích thước 13 chữ số trong đó 4 chữ số này sẽ được sử dụng để biểu diễn chính xác.

Vì vậy, tóm lại, đối với cột đó, bạn sẽ có giá trị tối đa là: 999999999.9999


1
câu trả lời hay nhất ở đây
Julian Silvestri

15

Có những giải pháp chính xác trong các ý kiến, nhưng để tóm tắt chúng thành một câu trả lời duy nhất:

Bạn phải sử dụng DECIMAL (6,4).

Sau đó, bạn có thể có 6 tổng số chữ số, 2 trước và 4 sau dấu thập phân (thang đo). Ít nhất là theo điều này .


6

Đặc tả MySQL 5.x cho kiểu dữ liệu thập phân là:DECIMAL[(M[,D])] [UNSIGNED] [ZEROFILL] . Câu trả lời ở trên là sai khi nói rằng số thập phân không dấu là không thể.

Để xác định trường chỉ cho phép số thập phân không dấu, với tổng độ dài 6 chữ số, 4 trong số đó là số thập phân, bạn sẽ sử dụng : DECIMAL (6,4) UNSIGNED.

Bạn cũng có thể tạo các kiểu dữ liệu FLOAT và DOUBLE không dấu (không âm).

Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.