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? 因為要算範圍距離,字串不能做計算