記錄一個工作中遇到的很詭異的bug,詳情如下:
需求
- 從第三方平台拿到一個
*.geojson
文件,不了解GeoJSON的同學可以先去了解一下,點擊跳轉,算是地信行業數據傳輸的一個標准了,這個文件有個特點:坐標數據特別多,而且集中在一條上; - 解析geojson文件,將feature數組下的每一條記錄,以字符串的形式存入數據庫,數據格式如下,大家可以感受一下:
PS:這里的坐標不止一條,后面很長,最長有8萬多字符;
3.從數據庫獲取字符串形式的坐標,前端自行解析;
問題就出現在第3步,在解析的時候,發現有些數據並沒有結尾處的花括號}
,那么解析肯定會失敗,但是數據一步步的解析、存儲、解析,都是嚴格按照要求來的,問題出在哪里呢?在數據庫的設計。
眾所周知,數據庫存儲字符串時,一般都用varchar
,但是難免會有長字符串,MySQL也有對應的類型,如:
- TINYTEXT
- TEXT
- MEDIUMTEXT
- LONGTEXT
每一種類型對應的字符串長度也是不一樣的,當時使用的是TEXT
,其存儲長度高達 65535 個字符,本來以為夠用了,但是沒成想有那么幾條坐標點集合的總長度加起來超過了這個數,高達67818個字符,這樣就會導致在存入MySQL的時候,后面一千多個字符會被漏掉,成為這個樣子:
很明顯,整個JSON結構就被破壞了
所以,這里就將該字段調整為MEDIUMTEXT
,可存儲的字符個數為16777215
個,重新導入數據,就恢復正常了
關於MySQL中字符類型的對比,可以參考這篇文章 Mysql存儲大數據字符串