亚洲av成人无遮挡网站在线观看,少妇性bbb搡bbb爽爽爽,亚洲av日韩精品久久久久久,兔费看少妇性l交大片免费,无码少妇一区二区三区

  免費(fèi)注冊 查看新帖 |

Chinaunix

  平臺 論壇 博客 文庫
最近訪問板塊 發(fā)新帖
查看: 1392 | 回復(fù): 0
打印 上一主題 下一主題

SQL SERVER字符集的研究 [復(fù)制鏈接]

論壇徽章:
0
跳轉(zhuǎn)到指定樓層
1 [收藏(0)] [報告]
發(fā)表于 2011-12-20 09:44 |只看該作者 |倒序瀏覽


一、 試驗歸類
測試SQL:
------------------------------------------------------------
drop table a
create table a(a varchar(2))

insert into a values('a')
insert into a values(N'a')
insert into a values('深圳')
insert into a values(N'深圳')
select a, len(a), datalength(a) from a

drop table #a
create table a(a varchar(2))

insert into #a values('a')
insert into #a values(N'a')
insert into #a values('深圳')
insert into #a values(N'深圳')
select a, len(a), datalength(a) from #a

------------------------------------------------------------
drop table a
create table a(a varchar(8000))

insert into a select REPLICATE('a', 8000)
insert into a select REPLICATE('深', 8000)
insert into a select REPLICATE(N'a', 8000)
insert into a select REPLICATE(N'深', 8000)
select a, len(a), datalength(a) from a

1. 字符集是支持雙字節(jié)的字符集如中文字符集(Collation name為Chinese_PRC_CI_AS)
 
 <1>. 定義varchar(2)
 
  (1) 正式表
   總結(jié):在中文字符集下,定義varchar(x),
    不論使用不使用N'',英文字符都占1個字節(jié),即可以存x個英文字符;
      不論使用不使用N'',中文字符都占2個字節(jié),即可以存(x / 2)個中文,select結(jié)果為漢字本身,不是亂碼;
      
  (2) 臨時表
   總結(jié):在中文字符集下,定義varchar(x), 
    和正式表表現(xiàn)一樣;
  
 <2>. 定義nvarchar(2)
 
  (1) 正式表
   總結(jié):在中文字符集下,定義nvarchar(x),
    不論使用不使用N'',英文字符都占2個字節(jié),即可以存x個英文字符;
      不論使用不使用N'',中文字符都占2個字節(jié),即可以存x個中文,select結(jié)果為漢字本身,不是亂碼;
      
  (2) 臨時表
   總結(jié):在中文字符集下,定義nvarchar(x), 
    和正式表表現(xiàn)一樣;
    
 <3>. 類型為varchar時,長度 x 和 datalength()對應(yīng),都指字節(jié)大;
    英文len() = datalength();
    中文len() = datalength() / 2;
    
    類型為nvarchar時,長度 x 和 len()對應(yīng),都指字符長度; 
   
2. 字符集是支持單字節(jié)的字符集如拉丁字符集(Collation name為Latin1_General_CI_AS)
  
 <1>. 定義varchar(2)
 
  (1) 正式表
   總結(jié):在英文字符集下,定義varchar(x),
    不論使用不使用N'',英文字符都占1個字節(jié),即可以存x個英文字符;
      不論使用不使用N'',中文字符都占1個字節(jié),即可以存x個中文,但只保存前半截中文編碼,所以select結(jié)果為亂碼;
      (特殊:如果使用N'',此時插入的字符數(shù)最大為4000)
      英文和中文 len() = datalength();
      
  (2) 臨時表
   總結(jié):在英文字符集下,定義varchar(x),
    不論使用不使用N'',英文字符都占1個字節(jié),即可以存x個英文字符;
    不使用N''時,中文占1個字節(jié),可以存x個漢字,但都只存入漢字前半截字符編碼,顯示為亂碼;
    使用N''時,中文占2個字節(jié),只可以存 x/2 個漢字,沒有亂碼,取出仍為漢字,說明在英文字符集下通過使用N''是可以保存漢字的;
    
    除用N''保存的中文外,其余英文和中文 len() = datalength();
    用N''保存的中文字符len() = datalength() / 2;
    
 <2>. 定義nvarchar(2)
 
  (1) 正式表
   總結(jié):在英文字符集下,定義nvarchar(x),
    不論使用不使用N'',英文字符都占2個字節(jié),即可以存x個英文字符;(注意每個字符比varchar用的空間大)
      不論使用不使用N'',中文字符都占2個字節(jié),即可以存x個中文字符,
      但不使用N''只保存前半截中文編碼,所以select結(jié)果為亂碼;
      使用N''則保存和取出都為漢字本身;
      
  (2) 臨時表
   總結(jié):在英文字符集下,定義nvarchar(x), 
    和正式表表現(xiàn)相同;
    
 <3>. 類型為varchar時,長度 x 和 datalength()對應(yīng),都指字節(jié)大。
    (臨時表中N''中文字符長度比較特殊;)
    類型為nvarchar時,長度 x 和 len()對應(yīng),都指字符長度; 
 
二、 使用歸類
 拋開不常用的臨時表不談,只看正式表,再加上varchar和nvarchar類型的最大長度,得到以下經(jīng)驗:
 <1> 最大長度問題
  1. 在中文字符集下使用varchar,最大長度可定義8000,這個8000是指字節(jié)數(shù)(datalength()),即最大可以保存8000個英文字符,4000個中文字符;
   特殊:若存入字符N'a',則最大能保存4000個字符,但其所占空間為4000字節(jié);
  2. 在中文字符集下使用nvarchar,最大長度可定義4000,這個4000是指字符個數(shù)(len()),即最大可以保存4000個英文字符,4000個中文字符;
 
  3. 在英文字符集下使用varchar,最大長度可定義8000,這個8000是指字節(jié)數(shù)(datalength()),由于中文英文都保存為1字節(jié),故最大可以保存8000個英文、中文字符;
  4. 在英文字符集下使用nvarchar,最大長度可定義4000,這個4000是指字符個數(shù)(len()),即最大可以保存4000個英文字符,4000個中文字符;
 <2> 文字顯示問題
  1. N''要和數(shù)據(jù)類型nvarchar, nchar一起使用,如果對varchar, char字段類型強(qiáng)制使用N'',則會產(chǎn)生一些特殊現(xiàn)象,甚至無法控制; 
  2. 在英文字符集下,想要保存特殊符號字符、中文等雙字節(jié)字符,在定義表結(jié)構(gòu)時要使用nvarchar或者nchar,在保存時要用N'';
  3. 在中文字符集下,數(shù)據(jù)庫系統(tǒng)缺省已經(jīng)可以保存特殊符號字符、中文等雙字節(jié)字符。即使用不使用N'',都按雙字節(jié)處理。但為了統(tǒng)一期間建議:
   在定義表結(jié)構(gòu)時如果使用nvarchar或者nchar,在保存時要用N'',
   在定義表結(jié)構(gòu)時如果使用varchar和char,此時不要使用N''操作;
  4. SUBSTRING ( expression , start , length )
   length:是一個整數(shù),指定子串的長度(要返回的字符數(shù)或字節(jié)數(shù))。
   中文字符集中按字符數(shù);
   英文字符集中,char, varchar按字節(jié)數(shù)取,nchar, nvarchar按字符數(shù);

 
三、 其他參考
 使用 Unicode 數(shù)據(jù)
  unicode代碼頁、排序規(guī)則、SQL Server 排序規(guī)則基礎(chǔ)知識、Windows 排序規(guī)則排序樣式、選擇 SQL 排序規(guī)則
 DBCS 字符

您需要登錄后才可以回帖 登錄 | 注冊

本版積分規(guī)則 發(fā)表回復(fù)

  

北京盛拓優(yōu)訊信息技術(shù)有限公司. 版權(quán)所有 京ICP備16024965號-6 北京市公安局海淀分局網(wǎng)監(jiān)中心備案編號:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年舉報專區(qū)
中國互聯(lián)網(wǎng)協(xié)會會員  聯(lián)系我們:huangweiwei@itpub.net
感謝所有關(guān)心和支持過ChinaUnix的朋友們 轉(zhuǎn)載本站內(nèi)容請注明原作者名及出處

清除 Cookies - ChinaUnix - Archiver - WAP - TOP