見出し画像

MySQL8.0では、地理座標の扱いに互換性が無い

mysql5.7でgeometryを試してみましたが、8.0では同じようにやっても動作しませんでした。

例えば、以下のようなクエリを実行すると、mysql5.7では問題ありませんが8.0ではエラーになってしまい、Latitudeの範囲は、-90.0000000から90.000000だよ?ってメッセージが出力されます。

mysql> SELECT VERSION();
+-----------+
| VERSION() |
+-----------+
| 5.7.29    |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT ST_AsText(ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326));
+--------------------------------------------------------------------------------+
| ST_AsText(ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326)) |
+--------------------------------------------------------------------------------+
| POINT(102.1893310546875 3.880696482497261)                                     |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECt VERSIOn();
+-----------+
| VERSIOn() |
+-----------+
| 8.0.19    |
+-----------+
1 row in set (0.00 sec)

mysql> SELECT ST_GeomFromText('POINT(102.1893310546875 3.880696482497261)', 4326);
ERROR 3617 (22S03): Latitude 102.189331 is out of range in function st_geomfromtext. It must be within [-90.000000, 90.000000].

そこには経度(-180~180)を入れるものだと認識しているので、このメッセージはおかしく無いか? そもそもLatitudeってどっちだっけ?ってなって混乱しまったので一旦整理すると、以下のようになります。(Longがつく方が範囲が大きいと覚えておけばなんとかなりそうな気もしなくないか?)

Latitude :  緯度, Y軸, 範囲は-90 ~ 90度
Longitude : 経度, X軸, 範囲は-180 ~ 180度

画像1

つまり、MySQL5.7では、POINT(X軸, Y軸) or POINT(経度, 緯度)というインターフェースだったものが、8.0dでPOINT(Y軸, X軸) or POINT(緯度, 経度)に変更されたということのようです。 XとYを入れ替えると以下のように動作します。

mysql> SELECT ST_ASTEXT(ST_GeomFromText('POINT(3.880696482497261 102.1893310546875)', 4326));
+--------------------------------------------------------------------------------+
| ST_ASTEXT(ST_GeomFromText('POINT(3.880696482497261 102.1893310546875)', 4326)) |
+--------------------------------------------------------------------------------+
| POINT(3.880696482497261 102.1893310546875)                                     |
+--------------------------------------------------------------------------------+
1 row in set (0.00 sec)

どうして変えちゃったの?

調べると、同じ問題にぶち当たった人が既に質問していました。

Mysql 8 ST_GeomFromText giving error Latitude out of range in function st_geomfromtext. It must be within [-90.000000, 90.000000] 

これに、よると英語では"longitude, latitude" よりも "latitude and langitude"と話す傾向があるので、(long, lat)じゃ無く(lat, long) になったとする回答がされています。

When you use Geography on MySQL (SRID = 4326) you use (lat, long). That's (y,x) typically. This is done because English speakers tend to say "latitude and longitude" rather than "longitude, latitude"

これが正しいかどうかはわかりませんが、この理由で後方互換性を担保しないという判断は個人的には支持できません。 いろんな事情を抜きにしてどうすべきか?と言われれば、 日本語でも、英語と同様に緯度, 経度と話す人が多いと気がする(自分だけか?)し、XとYが逆になっているのも気持ち悪いので8.0の仕様の方が良いかなと思いました。





この記事が気に入ったらサポートをしてみませんか?