MySQL学习-数据类型-JSON与空间类型

178 阅读3分钟

持续创作,加速成长!这是我参与「掘金日新计划 · 6 月更文挑战」的第30天,点击查看活动详情

前言

上篇我们学习了MySQL中的数据类型中的ENUM,SET以及二进制类型。有兴趣的小伙伴可以阅读(# MySQL学习-数据类型-ENUM,SET以及二进制类型)。
下面学习MySQL中的数据类型中的JSON与空间类型。

JSON类型

JSON是一种轻量级的数据交换格式。简介和清晰的层次结构使得JSON称为理想的交换语言。它易于人阅读和编写,同时也易于机器解析和生成,并有效地提升网络传输效率。

当需要检索JSON类型的字段中数据的某个具体值时,可以使用“->”和“->>”符号。

空间类型

MySQL空间类型扩展支持地理特征的生成、存储和分析。这里的地理特征表示世界上具有位置的任何东西,可以是一个实体,也可以是空间。也可以是一个可定义的位置。MySQL中使用Geometry(几何)来表示所有地理特征。Geometry指一个点或点的集合,代表世界上任何具有位置的事物。

MySQL的空间数据类型对应于OpenGIS类,包括单值类型:GEOMETRY、POINT、LINESTRING、POLYGON以及集合类型:MULTIPOINT、MULTILINESTRING、MULTIPLOYGON、GEOMETRYCOLLECTION。

Geometry是所有空间集合类型的基类,其他类型如POINT、LINESTRING、POLYGON都是Geometry的子类。

  • POINT就是点,有一个坐标值。POINT(1 2),坐标值支持DECIMAL类型,经度在前,纬度在后,用空格分隔。
  • LINESTRING就是线,由一系列点连接而成。如LINESTRING(1 2,3 4),点与点之间用逗号分隔,一个点中的经纬度用空格分隔,与POINT格式一致。
  • POLYGON是多边形。如POLYGON(1 1, 2 1, 2 2, 1 2)。

MULTIPOINT、MULTILINESTRING、MULTIPLOYGON、GEOMETRYCOLLECTION这4种类型都是集合类,是多个POINT、LINESTRING或POLYGON组合而成。

建议

在定义数据类型时,如果确定是整数,就用INT,如果是小数,一定用定点数类型DECIMAL(M,D)。如果是日期与时间,就用DATETIME。

这样做的好处是,首先确保系统不会因为数据类型定义出错。不过,凡事都有两面性,可靠性好,并不意味着高效。比如,TEXT虽然使用方便,但是效率不如CHAR(M)和VARCHAR(M)。

关于字符串的使用,参考阿里巴巴规范:

  • 任何字段如果为非负数,必须是UNSIGNED。
  • 小数类型为DECIMAL,禁止使用FLOAT和DOUBLE。
    • 在存储的时候,FLOAT和DOUBLE都存在精度缺失的问题,很可能在比较值的时候,得到不正确的结果。如果存储的数据范围超过DECIMAL的范围,建议将数据拆成整数和小数并分开存储。
  • 如果存储的字符串长度几乎相等,使用CAHR定长字符串类型。
  • VARCHAR是可变字符串,不预先分配存储空间,长度不要超过5000。如果存储长度大于此值,定义字段类型为TEXT,独立出来一张表,用主键来对应,避免影响其它字段索引效率。

今天先学习到这里,明天继续。