html的表單length長度是以字元個數計算的,不管是漢字還是字母,但是資料庫又是按位元組計算的,漢字佔2個字母佔1個,這樣容易造成寫入的時候長度超出的問題。
兩個問題:
1.有沒有好的方法,能夠在前端或者php或者mysql之間使用統一的方法計算長度?
2.還是只能把資料庫長度設的足夠大,讓表單永遠不會超出?
.
回複內容:
html的表單length長度是以字元個數計算的,不管是漢字還是字母,但是資料庫又是按位元組計算的,漢字佔2個字母佔1個,這樣容易造成寫入的時候長度超出的問題。
兩個問題:
1.有沒有好的方法,能夠在前端或者php或者mysql之間使用統一的方法計算長度?
2.還是只能把資料庫長度設的足夠大,讓表單永遠不會超出?
.
mysql在4.1之後,char和varchar定義的就是字元長度了。
具體可以去看下文檔The CHAR and VARCHAR Types。
而4.1的文檔中有直接提到。
The CHAR and VARCHAR types are declared with a length that indicates the maximum number of characters you want to store. For example, CHAR(30) can hold up to 30 characters. (Before MySQL 4.1, the length is interpreted as number of bytes.)
統一計算長度,是基於“長度”這個概念是一樣的標準的,首先你要規定你的“長度”指的是什麼。
如果“長度”指的位元組長度,那麼可以這樣(假設頁面編碼是utf8):
// javascriptfunction lengthInUtf8Bytes(str) { // Matches only the 10.. bytes that are non-initial characters in a multi-byte sequence. var m = encodeURIComponent(str).match(/%[89ABab]/g); return str.length + (m ? m.length : 0);}len = lengthInUtf8Bytes(str);//php$len = strlen($str);//mysqlCREATE DATABASE `byte_test` CHARACTER SET latin1 COLLATE latin1_general_ci;
javascript函數lengthInUtf8Bytes來自於String length in bytes in JavaScript
如果“長度”指的編碼長度,還是假設頁面utf8編碼:
// javascriptlen = str.length;// php$len = mb_strlen($str,"UTF-8");// mysqlCREATE DATABASE `utf8_test` CHARACTER SET utf8 COLLATE utf8_general_ci;
這樣長度都是一致的,所以要在最開始就定義好你的“長度”指的是什麼很重要
前台限制只是障眼法,資料庫較量弄長點,不用太摳門了
如果你統一都使用UTF-8編碼,就沒有這個苦惱了。資料庫表用UTF-8,一個漢字或字母都是一,也就是說varchar(2)類型,你肯定可以把 "測試” 這兩個字存入。對應mysql實際儲存會使用6個位元組,通常情況下一個漢字需要用3個位元組來儲存,但這是mysql底層做的事,跟你定義的varchar裡面的長度沒有關係。
2樓好專業,贊
資料庫欄位不一定非要搞得那麼精準,說十個位元組就一定限制十個位元組,限制長度是通過程式做的,資料庫欄位只是提供一個範圍而已
如果可以後台也需要對參數進行長度校正,別人是可以直接請求後台服務介面的。
前端有對於的maxlength可以控制一下輸入長度。
如果不怕麻煩的話,
你可以自己設計一個通用攔截器進行提交前檢查,
首先擷取資料庫的中繼資料資訊, 比如編碼和欄位長度(這個可以使用緩衝的資訊一般不會變化).
然後根據這個算出相應的欄位最長能容納幾個漢字,幾個英文字元.
之後在前端或者php計算出相應的位元組數, 這樣就不會有問題了.
不過效能會因此稍有損失.
更好的辦法就是對不定長度的資料把欄位使用變長類型比如varchar設計的足夠大.