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存儲大數據字符串


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM