Я хочу зберігати багато записів у базі даних MySQL. Усі вони містять грошові цінності. Але я не знаю, скільки цифр буде вставлено для кожної.
Який тип даних я повинен використовувати для цієї мети?
VARCHAR або INT (або інші числові типи даних)?
Я хочу зберігати багато записів у базі даних MySQL. Усі вони містять грошові цінності. Але я не знаю, скільки цифр буде вставлено для кожної.
Який тип даних я повинен використовувати для цієї мети?
VARCHAR або INT (або інші числові типи даних)?
Відповіді:
Оскільки гроші потребують точного представлення, не використовуйте типи даних, які є приблизно приблизними float
. Для цього можна використовувати числовий тип даних з фіксованою точкою
decimal(15,2)
15
- точність (загальна довжина значення, включаючи десяткові знаки)2
- кількість цифр після комиДивіться числові типи MySQL :
Ці типи застосовуються, коли важливо зберегти точну точність, наприклад, з грошовими даними.
decimal
і numeric
те саме.
numeric(19,4)
фінансові записи, що дає вам кращу руку, щоб легко грати та приймати нові запити.
Ви можете використовувати DECIMAL
або NUMERIC
обидва однакові
Типи DECIMAL і NUMERIC зберігають точні числові значення даних. Ці типи застосовуються, коли важливо зберегти точну точність, наприклад, з грошовими даними. У MySQL NUMERIC реалізований як DECIMAL, тому наступні зауваження щодо DECIMAL застосовуються однаково до NUMERIC. : MySQL
тобто DECIMAL(10,2)
Я вважаю за краще використовувати BIGINT
та зберігати значення, помноживши на 100 , щоб вони стали цілими.
Наприклад, щоб представити значення валюти 93.49
, значення має зберігатися як 9349
, відображаючи значення, яке ми можемо розділити на 100 і відобразити. Це займе менше місця для зберігання.
Застереження:
Здебільшого ми не виконуємоcurrency * currency
множення, якщо в цьому випадку ділимо результат на 100 і зберігаємо, щоб він повернувся до належної точності.
DECIMAL
? Ви створюєте необхідність перекладати копійки в долари, і горе, якщо ви забудете це в якийсь момент.
$0.005
або $0.12345
), оскільки вони не зменшаться до цілого числа після множення на 100. Якщо ви знаєте точність значень, зрозуміло, що кращий варіант - використовувати DECIMAL
. Але якщо ви не знаєте точності (як у моїх прикладах), тоді ... було FLOAT
б доречно?
Це залежить від вашої потреби.
Використання DECIMAL(10,2)
зазвичай досить , але якщо вам потрібно трохи більш точні значення , які ви можете встановити DECIMAL(10,4)
.
Якщо ви працюєте з великими значеннями, замініть 10
на 19
.
Якщо у вашій програмі потрібно обробляти кошти до трильйона, це має спрацювати: 13,2 Якщо вам потрібно дотримуватися GAAP (Загальноприйняті принципи бухгалтерського обліку), тоді використовуйте: 13,4
Зазвичай ви повинні підсумовувати свої кошти на рівні 13,4, перш ніж округлювати результат до 13,2.
Дійсно, це спирається на переваги програміста. Я особисто використовую: numeric(15,4)
щоб відповідати загальноприйнятим принципам бухгалтерського обліку ( GAAP ) .
double
.* задихатися *
Тому що він може представляти будь-яке 15-значне число без обмежень щодо десяткової крапки . Все для потворних 8 байт!
Отже, він може представляти:
0.123456789012345
123456789012345.0
... і все середнє.
Це корисно, оскільки ми маємо справу з глобальними валютами і double
можемо зберігати різні числа десяткових знаків, які ми, мабуть, зустрінемо.
Одне double
поле може представляти 999,999,999,999,999s в японських ієнах, 9,999,999,999,999.99s у доларах США і навіть 9,999,999,99999999s у біткойнах
Якщо ви спробуєте зробити те саме decimal
, вам потрібно decimal(30, 15)
14 байт.
Звичайно, використання double
не обійдеться без застережень.
Однак це не втрата точності, як це схильно зазначають деякі. Незважаючи на те, що double
сама по собі може не бути внутрішньо точною до базової системи 10 , ми можемо зробити її точною, округливши значення, яке ми витягуємо з бази даних, до її значних десяткових знаків. Якщо потрібно, це є. (наприклад, якщо це буде виведено, і необхідне представлення бази 10).
Застереження є, що коли ми виконуємо з нею арифметику, нам потрібно нормалізувати результат (округлюючи його до значущих знаків після коми) перед:
Інший вид застереження - на відміну від того, decimal(m, d)
де база даних не дозволить програмам вставляти число з більшою кількістю m
цифр, таких перевірок не існує double
. Програма може вставити введене користувачем значення 20 цифр, і в кінцевому підсумку воно буде мовчазно записано як неточну кількість.
1.410000000000
дванадцять значущих десяткових знаків), але помноживши це на 1 000 000 000 000 (що на 13 значущих цифр ліворуч від десяткової коми) означає, що ми працюємо з принаймні комбіновані 25 цифр значущості. Це набагато перевершує 15 доступних для подвійного, так що дизайн-розумний я думаю, що це було б дуже зламаним.
На той момент це питання ніхто не замислювався про ціну біткойна. Що стосується BTC, його, ймовірно, недостатньо для використання DECIMAL(15,2)
. Якщо біткойн підніметься до 100 000 доларів або більше, нам знадобиться хоча б DECIMAL(18,9)
підтримка криптовалют у наших додатках.
DECIMAL(18,9)
займає 12 байт місця в MySQL ( 4 байти на 9 цифр ).
Зберігання грошей, BIGINT
помножених на 100 і більше, з тим, щоб використовувати менше місця для зберігання, не має сенсу у всіх "нормальних" ситуаціях.
DECIMAL(13,4)
DECIMAL
.
DECIMAL(13,4)
представляє 9 розрядів + 4 цифри дробу (десяткових знаків) => 4 + 2 байти = 6 байтBIGINT
.Якщо потрібна відповідність GAAP або вам потрібні 4 знаки після коми:
ДЕКІМАЛЬНИЙ (13, 4), який підтримує максимальне значення:
$ 999,999,999,9999
В іншому випадку, якщо достатньо 2 знаків після коми: DECIMAL (13,2)
src: https://rietta.com/blog/best-data-types-for-currencymoney-in/
Помножує 10000 і зберігає як BIGINT, як "Валюта" у Visual Basic та Office. Дивіться https://msdn.microsoft.com/en-us/library/office/gg264338.aspx
deimal(10,2)
це те, що я використовую ... ви можете регулювати значення залежно від очікуваного розміру