首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >大数的MySQL点精度(例如IPv6)

大数的MySQL点精度(例如IPv6)
EN

Stack Overflow用户
提问于 2019-09-11 13:03:14
回答 1查看 55关注 0票数 0

我正在尝试使用LineString和Point进行IPv6地址范围匹配。但我认为这个问题更多地与MySQL如何处理大数精度有关。(请注意,以下使用较小数字的工作没有问题,即IPv4十进制表示法)。

对于IPv4,范围定义为LineString(Point(-1, ip_start), Point(1, ip_end))

在创建包含大量数字的Point()时,我似乎失去了精度,因此我的范围匹配是有缺陷的。

代码语言:javascript
运行
复制
MariaDB [mydb]> set @point=Point(0, 42541828702485584113142439188939931648);
Query OK, 0 rows affected (0.00 sec)

MariaDB [mydb]> select astext(@point);
+-------------------------------+
| astext(@point)                |
+-------------------------------+
| POINT(0 4.254182870248558e37) |
+-------------------------------+
1 row in set (0.00 sec)

MariaDB [mydb]> select st_y(@point);
+----------------------+
| st_y(@point)         |
+----------------------+
| 4.254182870248558e37 |
+----------------------+
1 row in set (0.00 sec)

MariaDB [mydb]> select cast(st_y(@point) as Decimal(39));
+----------------------------------------+
| cast(st_y(@point) as Decimal(39))      |
+----------------------------------------+
| 42541828702485580000000000000000000000 |
+----------------------------------------+
1 row in set (0.00 sec)

MariaDB [mydb]>

如何准确地使用大数的Point()

EN

回答 1

Stack Overflow用户

发布于 2019-09-11 13:15:33

SPATIAL函数(st_xpoint等)适用于DOUBLEs,而不是DECIMAL

DECIMAL(39)应该可以工作。但为什么不直接将其保留为字符串或十六进制字符串(VARCHAR(39) CHARACTER SET ascii)或BINARY(16)

请解释你的最终目标是什么让你想要使用空间工具。

下面是处理IP地址范围的代码( IPv4或IPv6的单独代码):http://mysql.rjweb.org/doc.php/ipranges

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57882415

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档