不可不知的小工具-C#字串長度處理


前情提要

本篇要分享的內容會接續這兩篇(string.LengthLEN() & DATALENGTH()),如果還沒看得可以先點進去看一下。

到底該如何解決

已知

  1. SSMS預設為UTF-16
  2. NVARCHAR(500)可以儲存1000個位元組,可能少於500個字元
  3. C#中 string.Length回傳值是字元數目,而非位元組數目
  4. 對越南文使用者來說一個單詞是一個字,但對電腦而言一個字不等於一個字元,例如:Người,這是5個字元
  5. PM限制該欄位輸入內容長度不可以大於250個字

程式端

目前想到的是使用GetByteCount()去取得位元組數量,再回來寫判斷,先讓程式端和資料庫端的基準對齊。
還是要來看看微軟文件對於這個方法的解釋

在衍生類別中覆寫時,計算編碼指定的字串字元所產生的位元組數目

這個方法的意思和T-SQL的DATALENGTH()有點類似,都是回傳位元組的數目。
說明:因為SSMS預設是用UTF-16編碼,所以在下圖有先選擇用UTF-16的編碼方式(第10行)去取得位元組數目,為了就是要讓資料庫端和程式碼端的資訊對齊。如果程式碼端沒有判斷輸入字串長度,再加上依照現有的欄位大小(nvarchar(500))寫入的話,這段越南文是可以存進資料庫,但是!資料會被截斷因為位元組數還是超過了資料庫的欄位大小限制

程式碼範例
https://ithelp.ithome.com.tw/upload/images/20231009/20162714epgeSfwWU5.jpg

Output
https://ithelp.ithome.com.tw/upload/images/20231009/20162714Rb2SLRtFiZ.jpg

結論

上述解法只有先讓程式碼端和資料庫端的儲存大小判斷先一致,並沒有解決PM要的250字的限制。我覺得要解決這個問題,要先定義250字到底是什麼?是250個字母?還是250個單詞?目前大家的認知水平應該是單詞數量,如果250字是指250個單詞數量的話,那在程式碼端就不能使用string.Length > 250判斷了。在資料庫端開nvarchar(500)好像也稍嫌不足。
如果之後要再回頭改的話,我的作法可能會先請PM提供各種會塞入的越南文資料,取要塞入最大位元組數目作為欄位的大小,再去修改資料庫欄位大小和程式碼端的判斷。

參考

[C#] 計算字串的長度方式

文章同步發布於[Day26]不可不知的小工具-C#字串長度處理







你可能感興趣的文章

重載父類別元素 (當類別裡含有自己的類別List的時候)

重載父類別元素 (當類別裡含有自己的類別List的時候)

煙雨丹霞

煙雨丹霞

Vue 元件 : Props in & Emit out

Vue 元件 : Props in & Emit out






留言討論