MySQL: бажаний тип стовпця для цін на (товар)?


78

У MySQL, який тип стовпця є кращим для зберігання ціни товару (або валют загалом)? Google дізнався, як часто використовують DECIMAL OF FLOAT, але мені цікаво, який із них краще.

Я зберігаю ціни від 0,01 до 25,00. Звичайно, також можуть бути більш високі значення. (Примітка: Я не прошу код копіювання-макарони, я просто надаю вам більше інформації, яка може допомогти вам сформувати більш повну відповідь).

Дякую

Відповіді:


85

Десятковий - це той, який я б використав

Основна різниця між десятковим / числовим та плаваючим: Float - це тип даних приблизного числа, що означає, що не всі значення в діапазоні типів даних можуть бути точно представлені. Десяткове / числове - це тип даних із фіксованою точністю, що означає, що всі значення в типі даних reane можуть бути представлені точно з точністю та масштабом.

Перетворення з десяткової або числової в плаваючу може призвести до певної втрати точності. Що стосується десяткових або числових типів даних, SQL Server розглядає кожну конкретну комбінацію точності та масштабу як інший тип даних. DECIMAL (4,2) та DECIMAL (6,4) - це різні типи даних. Це означає, що 11.22 та 11.2222 є різними типами, хоча це не стосується float. Для FLOAT (6) 11.22 та 11.2222 мають однакові типи даних.


Дякую jdt199 та Razzie, прийняв би обидві ваші відповіді, але вибрав вашу як найбільш повну.
SolidSmile

1
@Sheff DECIMAL (2,2) має бути DECIMAL (4,2). ДЕСЯТНИЧНИЙ (2,4) повинен бути ДІСЯЧНИЙ (6,4). Див. Dev.mysql.com/doc/refman/5.7/en/…
cgaldiolo

PrestaShop використовує десяткову (20,2). Так десятковий це !. github.com/PrestaShop/PrestaShop/blob/1.7.3.x/install-dev/data/…
DevWL

30

Тип поля "Десяткове число" хороший.

Якщо у вас високі ціни, тоді ви можете використовувати, product_price decimal(6,2) NOT NULL,тобто ви можете зберігати ціни до 6 цифр з десятковою комою перед 2 цифрами.

Максимальне значення поля product_price decimal(6,2) NOT NULL,зберігатиме ціну до 9999,99

Якщо всі ціни знаходяться в діапазоні від 0,01 до 25,00, тоді product_price decimal(4,2) NOT NULL,це буде добре, але якщо у вас будуть більш високі ціни, ви можете встановити будь-які значення в decimal(4,2).


16

Я б не використовував float, оскільки це може спричинити помилки округлення, оскільки це тип з плаваючою комою.

Використовуйте десяткове:

"Типи DECIMAL та NUMERIC використовуються для зберігання значень, для яких важливо зберегти точну точність, наприклад, з грошовими даними."

див .: http://dev.mysql.com/doc/mysql/en/numeric-types.html



10

Я віддаю перевагу INT (ціна помножена на 100), який вирішує проблему з плаваючою комою в іншому програмному забезпеченні.


5
Я успадкував таку систему, було смішно бачити, як цей хлопець множив усі ціни, перш ніж робити пошук у БД на основі ціни, і навпаки. Пізніше мені вистачило болю, щоб вловити помилки через це, перш ніж перейти до десяткової
Тебе

@ ГляОпаОпа, як ти вирішуєш проблему з плаваючою точкою, використовуючи десятковий знак?
Пітер

перед зберіганням я округлюю кожне число до третього знаку після точки і використовую ДЕКІМАЛЬ (N, 3) для зберігання
Тебе

@ ГляОпаОпа, навіщо взагалі турбуватись округленням, якщо DB зробить це за вас. проблема починається при порівнянні чисел 0,3! == 0,30000000001. тому в основному вам потрібно округляти цифри кожного разу, коли ви хочете зменшити чи додати числа.
Пітер

Оскільки всі постачальники платежів (PSP) працюють таким чином, це не повинно бути поганим рішенням для ціни з точністю до 2 знаків після коми.
Меломан

-10

Десяткове значення неправильне, тому що якщо ви хочете встановити ціну 12,99 десяткової коми, перетворіть його на 13,00, тож це неправильно, але якщо ви використовуєте float, ви можете зберегти його як 12,99. Тож правильна відповідь - float та varchar.


Це не правда.
Снефтель

Неправильно на декількох рівнях. Десяткове число [N, 2] не буде округлятися, як ви кажете, воно точно збереже ці 2 знаки після коми. Ось для чого це.
Саймон Тілсон

Я знаю, що люди дали негативний голос, але це все ще правда, відповідь FLOAT. Ви також можете перевірити, як більшість платіжних систем економлять ціну як плаваючу ... ЗБЕРЕГТИ ЦІНУ АТРИБУТУЙТЕ ЯК ПЛАВАТИ!
Берк Канбурлар,
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.