Какой тип данных MySQL следует использовать для широты / долготы с 8 десятичными знаками?
Я работаю с данными карты, а Latitude/Longitude
до 8 знаков после запятой. Например:
Latitude 40.71727401 Longitude -74.00898606
Я видел в документе Google, который использует:
lat FLOAT( 10, 6 ) NOT NULL, lng FLOAT( 10, 6 ) NOT NULL
однако их десятичные знаки достигают 6.
Должен ли я использовать FLOAT(10, 8)
или есть другой метод для хранения этих данных, чтобы он был точным. Он будет использоваться с расчетами карты. Благодаря!
- Когда целесообразно использовать связанный тип по сравнению с общим типом?
- Почему Java API использует int вместо короткого или байтового?
- PostgreSQL: разница между текстом и varchar (характер меняется)
- Разница между `data` и` newtype` в Haskell
- Получение типа System.Type из частичного имени типа
- Как определить разные типы для одного и того же classа в C ++
- Строка к двоичной в C #
- Каковы различия между типами () и isinstance ()?
- Каков тип строкового литерала в C ++?
- Что круто о дженериках, зачем их использовать?
- Как определить тип MIME загруженного файла в ASP.NET?
- динамический тип объекта
- Как проверить, наследует ли class другой class, не создавая его?
DECIMAL – это тип данных MySQL для точной арифметики. В отличие от FLOAT его точность фиксируется для любого размера числа, поэтому, используя его вместо FLOAT, вы можете избежать ошибок точности при выполнении некоторых вычислений. Если вы просто сохраняли и извлекали числа без расчета, то на практике FLOAT был бы безопасен, хотя нет никакого вреда в использовании DECIMAL. С расчетами FLOAT по-прежнему в основном нормально, но абсолютно уверен в 8d.p. точность вы должны использовать DECIMAL.
Ширины варьируются от -90 до +90 (gradleусов), поэтому для этого подходит DECIMAL (10, 8), но долготы колеблются от -180 до +180 (в gradleусах), поэтому вам нужен DECIMAL (11, 8). Первое число – это общее количество сохраненных цифр, а второе – число после десятичной точки.
Короче говоря: lat DECIMAL(10, 8) NOT NULL, lng DECIMAL(11, 8) NOT NULL
Это объясняет, как MySQL работает с типами данных с плавающей запятой.
Кроме того, вы увидите, что значения float
округлены.
// например: заданные значения 41.0473112,29.0077011 поплавок (11,7) | десятичное (11,7) --------------------------- 41.0473099 | 41.0473112 29.0077019 | 29.0077011
Вы можете установить тип данных как целое число со знаком. Когда вы храните координаты в SQL, вы можете установить как lat * 10000000 и long * 10000000. И когда вы выбираете с расстоянием / радиусом, вы разделите координаты хранения на 10000000. Я тестировал его с 300K строк, время ответа на запрос хорошее. (2 x 2,67 ГГц, 2 ГБ оперативной памяти, MySQL 5.5.49)
Лучший способ в моем случае – сохранить координаты как DOUBLE.
lat DOUBLE NOT NULL, lng DOUBLE NOT NULL
Он сохранит всю ценность без округления.
Если вам нужно округлить значение, мой совет заключается в том, что это лечение выполняется в начале данных, например, в пользовательском интерфейсе.
Использование переноса rubyов на рельсах
class CreateNeighborhoods < ActiveRecord::Migration[5.0] def change create_table :neighborhoods do |t| t.string :name t.decimal :latitude, precision: 15, scale: 13 t.decimal :longitude, precision: 15, scale: 13 t.references :country, foreign_key: true t.references :state, foreign_key: true t.references :city, foreign_key: true t.timestamps end end end
Не используйте float … Он будет округлять ваши координаты, что приведет к некоторым странным событиям.
Использовать десятичную