sql server 漢字的長度


  前幾天改了人家程序中的一個小bug,就是輸入時長度的校驗問題。項目是.Net的,數據庫是 sql server的。檢查了一下,發現以前的人員把長度給控制小了,數據庫中允許輸入256的長度,而別人在asp程序中只定義了64.當時很急,我發現了這個問題之后,就想當然的的把64改成256.測測可以保存成功,應該可以了。后來頭跟我說,256的長度應該沒有考慮漢字吧,應該把長度定為128,免得輸入256個漢字存到數據庫中,把數據庫給搞崩了。我們平時都是用ORACLE的,對sql server數據庫不是很熟,我說沒有啊,剛才我保存256漢字成功了,並且數據庫中也存進去了啊。頭說不會是自動截了多余的部分吧?我看看並沒有這樣,是會存進去。把長度改為257的時候,頁面會崩掉。

      后來我又改了另外一個字段的屬性,明明都是256,但是這個卻不一樣,這個只能輸入256個英文字母,但是只能輸入128個漢字。我看看這個字段的檢驗實在js中的,有一個lengthB()的方法,估計這個會是控制字節數的。

     后來我查了數據庫中的定義,他們的屬性都是nvarchar的,看了下面我在網上搜的資料就明白了。

       (1)char、varchar、text和nchar、nvarchar、ntext char和varchar的長度都在1到8000之間,它們的區別在於char是定長字符數據,而varchar是變長字符數據。所謂定長就是長度固定的,當輸入的數據長度沒有達到指定的長度時將自動以英文空格在其后面填充,使長度達到相應的長度;而變長字符數據則不會以空格填充。text存儲可變長度的非Unicode數據,最大長度為2^31-1(2,147,483,647)個字符。

        后面三種數據類型和前面的相比,從名稱上看只是多了個字母"n",它表示存儲的是Unicode數據類型的字符。寫過程序的朋友對Unicode應該很了解。字符中,英文字符只需要一個字節存儲就足夠了,但漢字眾多,需要兩個字節存儲,英文與漢字同時存在時容易造成混亂,Unicode字符集就是為了解決字符集這種不兼容的問題而產生的,它所有的字符都用兩個字節表示,即英文字符也是用兩個字節表示。nchar、nvarchar的長度是在1到4000之間。和char、varchar比較:nchar、nvarchar則最多存儲4000個字符,不論是英文還是漢字;而char、varchar最多能存儲8000個英文,4000個漢字。可以看出使用nchar、nvarchar數據類型時不用擔心輸入的字符是英文還是漢字,較為方便,但在存儲英文時數量上有些損失。

    (2)datetime和smalldatetime datetime:從1753年1月1日到9999年12月31日的日期和時間數據,精確到百分之三秒。 smalldatetime:從1900年1月1日到2079年6月6日的日期和時間數據,精確到分鍾。

     (3)bitint、int、smallint、tinyint和bit bigint:從-2^63(-9223372036854775808)到2^63-1(9223372036854775807)的整型數據。 int:從-2^31(-2,147,483,648)到2^31-1(2,147,483,647)的整型數據。 smallint:從-2^15(-32,768)到2^15-1(32,767)的整數數據。 tinyint:從0到255的整數數據。 bit:1或0的整數數據。

    (4)decimal和numeric 這兩種數據類型是等效的。都有兩個參數:p(精度)和s(小數位數)。p指定小數點左邊和右邊可以存儲的十進制數字的最大個數,p必須是從 1到38之間的值。s指定小數點右邊可以存儲的十進制數字的最大個數,s必須是從0到p之間的值,默認小數位數是0。

    (5)float和real float:從-1.79^308到1.79^308之間的浮點數字數據。 real:從-3.40^38到3.40^38之間的浮點數字數據。在SQL Server中,real的同義詞為float(24)。


免責聲明!

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



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