前言
公司最近要打入越南市場,所以有開始接觸一些越南相關的處理事宜。不知道大家有沒有看過越南文,基本上一個詞都超長xD因為之前都只有做台灣跟中國的市場,所以都不太會有一個詞很長的問題,欄位基本上開個nvarchar(50)就差不多了。今天就來分享一下踩雷過程~
情境提要
我要把下圖的越南文內容透過敲API匯入excel存進DB,資料庫該欄位的大小是nvarchar(500)。而在excel上該欄位輸入的限制字數是250字
已知:在word上這串文字字數為138,所以看起來很合理嘛~
先來認識下面這幾個東西
字元
先來看看維基百科對於字元的定義
在電腦和電信領域中,字元(character)是一個資訊單位。對使用字母系統或音節文字等自然語言,它大約對應為一個音位、類音位的單位或符號。簡單來講就是一個漢字、假名、韓文字……,或是一個英文、其他西方語言的字母。
簡單來說,字元可以說是一個字母、數字、標點符號或空白。像是A12B?3C,這樣就是7個字元
位元組(byte)/字節
再來看看維基百科的說明
通常用作電腦及手機及手錶等 資訊計量單位,不分資料類型。用於編碼單個字元所需要的位元數量
- 1 byte = 8 bit(位元)
上面的認知都有了,那就讓我們繼續看下去~
string.Length
前面有提到我的字數限制是250,所以我就用了string.Length去做判斷。加上了這段判斷總該符合PM需求了吧也應該要可以成功匯入上面提到的內容,但實際上卻直接噴Exception了。
if(input.Length > 250)
{
throw new Exception("字數超過限制");
}
原因是什麼呢????查了一下微軟的文件,內容如下:
取得目前 String 物件中字元的數目。
綜合前面的知識就會發現,string.Length這個屬性回傳的結果其實是去計算這個字串裡面的字元數,再白話文一點就是這邊算的會是有多少個字母及空白。
舉例來說: Người lao động,這串越南文透過string.Length回傳出來結果會是14
如果到這邊大家認知都還一樣,就可以繼續往下看~有了上面的舉例,就可以再套回情境提要的問題了。所以這就是為什麼最前面情境提要會噴掉的原因了。實際把情境提要那串越南文去跑string.Length會發現回傳是618,我的判斷是大於250,那當然會直接丟exception!
中文就不會有爆掉的問題嗎?
等等會用下圖的例子說明
把上圖的內容文字用string.Length,回傳結果會是163。雖然看起來也是落落長,但一個國字就代表一個字元,所以不會像越南文一個字母是一個字元但卻還沒辦法組成一個詞。
結論
程式面端的問題找到了,明天就來看進資料庫端會有什麼問題吧!