MySQL中存储字符长度溢出
记录一个工作中遇到的很诡异的bug,详情如下:
需求
- 从第三方平台拿到一个
*.geojson
文件,不了解GeoJSON的同学可以先去了解一下,点击跳转,算是地信行业数据传输的一个标准了,这个文件有个特点:坐标数据特别多,而且集中在一条上; - 解析geojson文件,将feature数组下的每一条记录,以字符串的形式存入数据库,数据格式如下,大家可以感受一下:
PS:这里的坐标不止一条,后面很长,最长有8万多字符;
3.从数据库获取字符串形式的坐标,前端自行解析;
问题就出现在第3步,在解析的时候,发现有些数据并没有结尾处的花括号}
,那么解析肯定会失败,但是数据一步步的解析、存储、解析,都是严格按照要求来的,问题出在哪里呢?在数据库的设计。
众所周知,数据库存储字符串时,一般都用varchar
,但是难免会有长字符串,MySQL也有对应的类型,如:
- TINYTEXT
- TEXT
- MEDIUMTEXT
- LONGTEXT
每一种类型对应的字符串长度也是不一样的,当时使用的是TEXT
,其存储长度高达 65535 个字符,本来以为够用了,但是没成想有那么几条坐标点集合的总长度加起来超过了这个数,高达67818个字符,这样就会导致在存入MySQL的时候,后面一千多个字符会被漏掉,成为这个样子:
很明显,整个JSON结构就被破坏了
所以,这里就将该字段调整为MEDIUMTEXT
,可存储的字符个数为16777215
个,重新导入数据,就恢复正常了
关于MySQL中字符类型的对比,可以参考这篇文章 Mysql存储大数据字符串