MySQL中存储字符长度溢出

记录一个工作中遇到的很诡异的bug,详情如下:

需求

  1. 从第三方平台拿到一个 *.geojson 文件,不了解GeoJSON的同学可以先去了解一下,点击跳转,算是地信行业数据传输的一个标准了,这个文件有个特点:坐标数据特别多,而且集中在一条上;
  2. 解析geojson文件,将feature数组下的每一条记录,以字符串的形式存入数据库,数据格式如下,大家可以感受一下:

    PS:这里的坐标不止一条,后面很长,最长有8万多字符;
    3.从数据库获取字符串形式的坐标,前端自行解析;
    问题就出现在第3步,在解析的时候,发现有些数据并没有结尾处的花括号 },那么解析肯定会失败,但是数据一步步的解析、存储、解析,都是严格按照要求来的,问题出在哪里呢?在数据库的设计。
    众所周知,数据库存储字符串时,一般都用 varchar,但是难免会有长字符串,MySQL也有对应的类型,如:
  • TINYTEXT
  • TEXT
  • MEDIUMTEXT
  • LONGTEXT
    每一种类型对应的字符串长度也是不一样的,当时使用的是 TEXT ,其存储长度高达 65535 个字符,本来以为够用了,但是没成想有那么几条坐标点集合的总长度加起来超过了这个数,高达67818个字符,这样就会导致在存入MySQL的时候,后面一千多个字符会被漏掉,成为这个样子:

    很明显,整个JSON结构就被破坏了
    所以,这里就将该字段调整为 MEDIUMTEXT,可存储的字符个数为 16777215个,重新导入数据,就恢复正常了
    关于MySQL中字符类型的对比,可以参考这篇文章 Mysql存储大数据字符串
posted on 2021-03-03 16:36  高冷的恒哥  阅读(1638)  评论(0编辑  收藏  举报