raydchang / IT技术 / SQL SERVER字符集的研究

分享

   

SQL SERVER字符集的研究

2010-08-18  raydchang

  SQL SERVER字符集的研究

2006-08-12 00:38

http://rickel.cnblogs.com/archive/2005/03/24/125162.html

Chinese_PRC_CI_AS

1.在MS-DOS模式下运行: 
c:>net stop mssqlserver 

2.然后运行\\mssql\binn\rebuildm.exe文件重建master库 
字符集选ISO,排序方式二进制,大小写敏感。 

3.重建完后在MS-DOS模式下运行: 
c:>net start mssqlserver 

如果第3步不成功也不要紧,你可以继续执行这句话或者到控制面板中去以图形化方式激活SQL Server的服务。

如果是想使用unicode字符集,可定义数据类型为nchar,nvarchar,ntext等。
如果是想改变排序规则,请使用alter table 加以下子句
COLLATE 
::=
{ Windows_collation_name } | { SQL_collation_name }

Microsoft? SQL Server? 2000 支持多种排序规则。排序规则对控制正确使用语言(如马其顿语或波兰语)或字母表(如西欧语言使用的拉丁字母表 Latin1_General)字符的规则进行编码。

每个 SQL Server 排序规则指定三个属性:

用于 Unicode 数据类型(nchar、nvarchar 和 ntext)的排序次序。排序次序定义字符的排序序列,以及在比较操作中对字符取值的方法。

用于非 Unicode 字符数据类型(char、varchar 和 text)的排序次序。

用于存储非 Unicode 字符数据的代码页。 sql7.0 是通过 rebuild master sql2000 应该也是把关闭 Microsoft? SQL Server? 2000,然后运行 Rebuildm.exe。该程序位于 Program Files\Microsoft SQL Server\80\Tools\Binn 目录中。在"重建 Master"对话框中单击"浏览"按钮。在"浏览文件夹"对话框中,选择 SQL Server 2000 光盘上或用于安装 SQL Server 2000 的共享网络目录中的 \Data 文件夹,然后单击"确定"按钮。单击"设置"按钮。在"排序规则设置"对话框中,验证或更改用于 Master 数据库或其它数据库的设置。最初,显示的是默认排序规则设置,但这些设置有可能与安装期间选择的排序规则不匹配。可以选择与安装期间使用的排序规则相同的设置,也可以选择新的排序规则设置。完成后单击"确定"按钮。在"重建 Master"对话框中单击"重建"按钮以启动进程。 重建 Master 实用工具重新安装 master 数据库。说明 若要继续,则可能需要终止正在运行的服务器。




一、 试验归类
测试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. 字符集是支持双字节的字符集如中文字符集(Collation name为Chinese_PRC_CI_AS)

<1>. 定义varchar(2)

(1) 正式表
总结:在中文字符集下,定义varchar(x),
不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;
不论使用不使用N'',中文字符都占2个字节,即可以存(x / 2)个中文,select结果为汉字本身,不是乱码;

(2) 临时表
总结:在中文字符集下,定义varchar(x),
和正式表表现一样;

<2>. 定义nvarchar(2)

(1) 正式表
总结:在中文字符集下,定义nvarchar(x),
不论使用不使用N'',英文字符都占2个字节,即可以存x个英文字符;
不论使用不使用N'',中文字符都占2个字节,即可以存x个中文,select结果为汉字本身,不是乱码;

(2) 临时表
总结:在中文字符集下,定义nvarchar(x),
和正式表表现一样;

<3>. 类型为varchar时,长度 x 和 datalength()对应,都指字节大小;
英文len() = datalength();
中文len() = datalength() / 2;

类型为nvarchar时,长度 x 和 len()对应,都指字符长度;

2. 字符集是支持单字节的字符集如拉丁字符集(Collation name为Latin1_General_CI_AS)

<1>. 定义varchar(2)

(1) 正式表
总结:在英文字符集下,定义varchar(x),
不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;
不论使用不使用N'',中文字符都占1个字节,即可以存x个中文,但只保存前半截中文编码,所以select结果为乱码;
(特殊:如果使用N'',此时插入的字符数最大为4000)
英文和中文 len() = datalength();

(2) 临时表
总结:在英文字符集下,定义varchar(x),
不论使用不使用N'',英文字符都占1个字节,即可以存x个英文字符;
不使用N''时,中文占1个字节,可以存x个汉字,但都只存入汉字前半截字符编码,显示为乱码;
使用N''时,中文占2个字节,只可以存 x/2 个汉字,没有乱码,取出仍为汉字,说明在英文字符集下通过使用N''是可以保存汉字的;

除用N''保存的中文外,其余英文和中文 len() = datalength();
用N''保存的中文字符len() = datalength() / 2;

<2>. 定义nvarchar(2)

(1) 正式表
总结:在英文字符集下,定义nvarchar(x),
不论使用不使用N'',英文字符都占2个字节,即可以存x个英文字符;(注意每个字符比varchar用的空间大)
不论使用不使用N'',中文字符都占2个字节,即可以存x个中文字符,
但不使用N''只保存前半截中文编码,所以select结果为乱码;
使用N''则保存和取出都为汉字本身;

(2) 临时表
总结:在英文字符集下,定义nvarchar(x),
和正式表表现相同;

<3>. 类型为varchar时,长度 x 和 datalength()对应,都指字节大小;
(临时表中N''中文字符长度比较特殊;)
类型为nvarchar时,长度 x 和 len()对应,都指字符长度;

二、 使用归类
抛开不常用的临时表不谈,只看正式表,再加上varchar和nvarchar类型的最大长度,得到以下经验:
<1> 最大长度问题
1. 在中文字符集下使用varchar,最大长度可定义8000,这个8000是指字节数(datalength()),即最大可以保存8000个英文字符,4000个中文字符;
特殊:若存入字符N'a',则最大能保存4000个字符,但其所占空间为4000字节;
2. 在中文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符;

3. 在英文字符集下使用varchar,最大长度可定义8000,这个8000是指字节数(datalength()),由于中文英文都保存为1字节,故最大可以保存8000个英文、中文字符;
4. 在英文字符集下使用nvarchar,最大长度可定义4000,这个4000是指字符个数(len()),即最大可以保存4000个英文字符,4000个中文字符;
<2> 文字显示问题
1. N''要和数据类型nvarchar, nchar一起使用,如果对varchar, char字段类型强制使用N'',则会产生一些特殊现象,甚至无法控制;
2. 在英文字符集下,想要保存特殊符号字符、中文等双字节字符,在定义表结构时要使用nvarchar或者nchar,在保存时要用N'';
3. 在中文字符集下,数据库系统缺省已经可以保存特殊符号字符、中文等双字节字符。即使用不使用N'',都按双字节处理。但为了统一期间建议:
在定义表结构时如果使用nvarchar或者nchar,在保存时要用N'',
在定义表结构时如果使用varchar和char,此时不要使用N''操作;
4. SUBSTRING ( expression , start , length )
length:是一个整数,指定子串的长度(要返回的字符数或字节数)。
中文字符集中按字符数取;
英文字符集中,char, varchar按字节数取,nchar, nvarchar按字符数取;


三、 其他参考
使用 Unicode 数据
unicode代码页、排序规则、SQL Server 排序规则基础知识、Windows 排序规则排序样式、选择 SQL 排序规则
DBCS 字符

请问,如何能查询出sql server2000的字符集?
在哪里查看,或者是用什么sql语句可以查出。

先声名一下,我要的不是“排序规则”,现在在网上,包括在csdn上查到的,大家所说的都是sqlserver的排序规则(比如cmd->rebuildm.exe的方式),得出来的一般是chinese_pcr_ci_as等等,这并不是我想要的。

我想知道的是sqlserver用的到底是GBK,或者是UTF-8,又或者是GB2312等等,
例如在oracle里可以用“select userenv(‘language’) from dual”查询出它的字符集(GBK或UTF-8)。

use master
select * from syscharsets

sqlserver使用的字符集取决于windows支持的字符集,windows支持的sqlserver都支持
char,varchar,text用于非unicode字符数据
nchar,nvarchar,ntext用于unicode字符数据

1.用sp_helpsort就可以查出当前sql的排序规则,字符集就是用排序规则的前半部分来表达的。
2.用全局变量@@language可以看你当前的语言,用sp_helplanguage可以查看当前语言的详细格式
3.用sp_enumcodepages可以查看sql支持字符集,但并没有与1中的排序规则前部分对应

所以要查看sql的字符集,应该是用sp_helpsort得出的结果,再看结果的前半部比如chinese_prc就代表简体中文的Unicode字符,至于其它的目前我还不知道

sqlserver支持的字符集和sqlserver字符的排序规则是两回事
排序规则是对字符类数据排序时用哪个字符集的顺序来排
sqlserver支持的字符集就是windows支持的字符集
unicode字符集基本上包括了世界各种语言的字符集
其中包括中文的GB2312,GBK,以及超大字符集等等
sqlserver都支持的
前提是windows要安装了这些字符集的字库,才能正常显示

syscharsets系统表的帮助
每个字符集在表中各占一行,表中还包含定义供 Microsoft® SQL Server™ 使用的排序次序。排序次序中的一个在 sysconfigures 中标记为默认排序次序,该次序是实际使用的唯一次序。  

列名 数据类型 描述  
type smallint 该行表示的实体类型。1001 是字符集;2001 是排序次序。  
id tinyint 字符集或排序次序的唯一 ID。注意排序次序和字符集不能共享相同的 ID 号。保留从 1 到 240 的 ID 范围供 SQL Server 使用。  
csid tinyint 如果该行表示字符集,则不使用该字段。如果该行表示排序次序,则该字段是在其上生成排序次序的字符集 ID。假设具有该 ID 的字符集行存在于该表中。  
status smallint 内部系统状态信息位。  
name sysname 字符集或排序次序的唯一名称。该字段必须只包含字母 A-Z 或 a-z、数字 0 – 9 和下划线 (_)。必须以字母开头。  
description nvarchar(255) 字符集或排序次序功能的可选描述。  
binarydefinition varbinary(255) 仅限内部使用。  
definition image 字符集或排序次序的内部定义。该字段中的数据结构取决于类型。  

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多
    喜欢该文的人也喜欢 更多

    ×
    ×

    ¥.00

    微信或支付宝扫码支付:

    开通即同意《个图VIP服务协议》

    全部>>