MySQL 經緯度的欄位儲存格式設定

MySQL 對 Geo 的經緯度欄位格式要設什麼值,看到蠻多不同的答案的,來蒐集測試看看。

MySQL 經緯度的欄位儲存格式設定

因為經緯度的格式是浮點數,有正負值,而且小數點後面的位數還不少,所以會造成一些問題。

先說說結論,下述測試看來這個比較可行:

  • lat DECIMAL( 10, 8 ) NOT NULL
  • lng DECIMAL( 11, 8 ) NOT NULL

經緯度欄位格式的設定文件、測試

Google 文件(取自:Creating a Store Locator with PHP, MySQL & Google Maps)是用下述:

  • lat FLOAT( 10, 6 ) NOT NULL
  • lng FLOAT( 10, 6 ) NOT NULL

但是這邊有寫可能有問題:MySQL 5.7 Reference Manual :: B.5.4.8 Problems with Floating-Point Values

依照此篇:What MySQL data type should be used for Latitude/Longitude with 8 decimal places?建議的,採用下述:

  • lat DECIMAL(10, 8) NOT NULL
  • lng DECIMAL(11, 8) NOT NULL

測試

下述的測試比較格式

  • float(11,7)
  • float(10,6)
  • decimal(11,7)
  • decimal(10,8) + decimal(11,8)

經緯度的值寫入

  • Latitude 41.0473112
  • Longitude 29.0077011
float(11,7) float(10,6) decimal(11,7) decimal(10,8) + decimal(11,8)
41.0473099 41.047310 41.0473112 41.04731120
29.0077019 29.007702 29.0077011 29.00770110

經緯度的值寫入

  • Latitude 40.71727401
  • Longitude -74.00898606
float(11,7) float(10,6) decimal(11,7) decimal(10,8) + decimal(11,8)
40.7172737 40.717274 40.7172740 40.71727401
-74.0089874 -74.008987 -74.0089861 -74.00898606

目前測試起來,應該是先使用

  • lat DECIMAL( 10, 8 ) NOT NULL
  • lng DECIMAL( 11, 8 ) NOT NULL

註:為何不使用 varchar? 因為要算範圍距離,字串不能做計算

作者: Tsung

對新奇的事物都很有興趣, 喜歡簡單的東西, 過簡單的生活.

發表迴響

這個網站採用 Akismet 服務減少垃圾留言。進一步了解 Akismet 如何處理網站訪客的留言資料