MySQL: loại cột ưa thích cho giá (sản phẩm)?


78

Trong MySQL, loại cột ưa thích để lưu trữ giá của sản phẩm (hoặc đơn vị tiền tệ nói chung) là gì? Google biết được rằng DECIMAL của FLOAT thường được sử dụng, nhưng tôi tự hỏi cái nào tốt hơn.

Tôi đang lưu trữ giá dao động từ 0,01 đến 25,00. Tất nhiên giá trị cao hơn cũng có thể có. (Lưu ý: Tôi không yêu cầu sao chép mã mì ống, tôi chỉ cung cấp cho bạn thêm thông tin có thể giúp bạn hình thành câu trả lời đầy đủ hơn).

Cảm ơn

Câu trả lời:


85

Số thập phân là số tôi sẽ sử dụng

Sự khác biệt cơ bản giữa Decimal / Numeric và Float: Float là kiểu dữ liệu Số gần đúng, có nghĩa là không phải tất cả các giá trị trong phạm vi kiểu dữ liệu đều có thể được biểu diễn chính xác. Decimal / Numeric là kiểu dữ liệu có độ chính xác cố định, có nghĩa là tất cả các giá trị trong kiểu dữ liệu reane có thể được biểu diễn chính xác với độ chính xác và tỷ lệ.

Chuyển đổi từ Decimal hoặc Numeric sang float có thể gây ra một số mất độ chính xác. Đối với kiểu dữ liệu Thập phân hoặc Số, SQL Server coi từng kết hợp cụ thể của độ chính xác và tỷ lệ là một kiểu dữ liệu khác nhau. DECIMAL (4,2) và DECIMAL (6,4) là các kiểu dữ liệu khác nhau. Điều này có nghĩa là 11.22 và 11.2222 là các loại khác nhau mặc dù đây không phải là trường hợp của float. Đối với FLOAT (6) 11.22 và 11.2222 là cùng một kiểu dữ liệu.


Cảm ơn jdt199 và Razzie, sẽ chấp nhận cả hai câu trả lời của bạn nhưng đã chọn câu trả lời của bạn vì câu trả lời đầy đủ nhất.
SolidSmile

1
@Sheff DECIMAL (2,2) phải là DECIMAL (4,2). DECIMAL (2,4) phải là DECIMAL (6,4). Xem dev.mysql.com/doc/refman/5.7/en/…
cgaldiolo

PrestaShop sử dụng Decimal (20,2). Vì vậy, nó là số thập phân !. github.com/PrestaShop/PrestaShop/blob/1.7.3.x/install-dev/data/…
DevWL

30

Loại trường "Thập phân" là tốt.

Nếu bạn có giá cao thì bạn có thể sử dụng, product_price decimal(6,2) NOT NULL,tức là bạn có thể lưu trữ giá lên đến 6 chữ số với dấu thập phân trước 2 chữ số.

Giá trị tối đa cho trường product_price decimal(6,2) NOT NULL, sẽ lưu trữ giá lên đến 9999,99

Nếu tất cả giá nằm trong khoảng từ 0,01 đến 25,00 thì product_price decimal(4,2) NOT NULL,tốt, nhưng nếu bạn có giá cao hơn thì bạn có thể đặt bất kỳ giá trị nào decimal(4,2).


16

Tôi sẽ không sử dụng float vì điều đó có thể gây ra lỗi làm tròn, vì nó là kiểu dấu phẩy động.

Sử dụng số thập phân:

"Các loại DECIMAL và NUMERIC được sử dụng để lưu trữ các giá trị mà điều quan trọng là duy trì độ chính xác chính xác, chẳng hạn như với dữ liệu tiền tệ."

xem: http://dev.mysql.com/doc/mysql/en/numeric-types.html



10

Tôi thích INT (giá nhân với 100) giải quyết vấn đề dấu phẩy động trong phần mềm khác.


5
Tôi thừa hưởng hệ thống như vậy, thật buồn cười khi thấy anh chàng này nhân tất cả các mức giá trước khi thực hiện tìm kiếm trong DB dựa trên giá và ngược lại. Sau đó tôi đã có đủ đau bắt lỗi do của việc này trước khi chuyển sang số thập phân
Tebe

@ ГляОпаОпа làm cách nào để bạn giải quyết vấn đề dấu phẩy động bằng cách sử dụng số thập phân?
Peter

trước khi lưu trữ Tôi tròn mỗi số vào dấu hiệu thứ ba sau thời điểm và sử dụng DECIMAL (N, 3) để lưu trữ
Tebe

@ ГляОпаОпа tại sao thậm chí còn bận tâm làm tròn nếu DB sẽ làm điều đó cho bạn. vấn đề bắt đầu khi bạn so sánh các số 0,3! == 0,30000000001. vì vậy về cơ bản bạn cần phải làm tròn số mỗi khi bạn muốn trừ hoặc cộng số.
Peter

Vì tất cả các nhà cung cấp dịch vụ thanh toán (PSP) đều hoạt động theo cách này, đây không phải là một giải pháp tồi cho giá có độ chính xác 2 dấu thập phân.
Meloman

-10

Số thập phân là sai vì nếu bạn muốn đặt giá 12,99 thập phân, hãy chuyển nó thành 13,00. Vì vậy, điều này là sai nhưng nếu bạn sử dụng float, bạn có thể lưu nó thành 12,99. Vì vậy, câu trả lời đúng là float và varchar.


Đo không phải sự thật.
Sneftel

Sai ở một số cấp độ. Decimal [N, 2] sẽ không làm tròn như bạn nói, nó sẽ giữ nguyên chính xác 2 chữ số thập phân đó. Đó là những gì nó dành cho.
Simon Tillson

Tôi biết mọi người đã bỏ phiếu tiêu cực nhưng nó vẫn đúng, câu trả lời là FLOAT. Bạn cũng có thể kiểm tra hầu hết các hệ thống thanh toán tiết kiệm giá dưới dạng thả nổi ... TIẾT KIỆM GIÁ NHƯ SÀN!
Berk Kanburlar
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.