SQL 字符集的更改

问题:向SQL Server数据库中插入”汉字“,我写的汉字都变成了?? 

分析及解决方法:

建立字段时出现问题

我建立的表

CREATE TABLE [dbo].[person] (
 [username] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL primary key,
 [password] [varchar] (255) COLLATE SQL_Latin1_General_CP1_CI_AS NOT NULL ,
 [birthday] [datetime] not NULL,
  )

SQL_Latin1_General_CP1_CI_AS 是COLLATE的名字,这个字段导致不能输入汉字,

改正为

/****** Object:  Table [dbo].[person]    Script Date: 2007-4-30 12:49:41 ******/
CREATE TABLE [dbo].[person] (
 [username] [varchar] (255) COLLATE Chinese_PRC_CS_AI NOT NULL ,

//可输入汉字,同时区分大小(CS),   详见SQL中SQL 排序规则名称”
 [password] [varchar] (255) COLLATE Chinese_PRC_CS_AI NULL ,
 [birthday] [datetime] NULL
) ON [PRIMARY]
GO

ALTER TABLE [dbo].[person] WITH NOCHECK ADD
 CONSTRAINT [PK__person__76CBA758] PRIMARY KEY  CLUSTERED
 (
  [username]
 )  ON [PRIMARY]
GO

注:此代码为SQL生成的脚本

http://community.csdn.net/Expert/topic/5503/5503614.xml?temp=.505398

存中文,字段要用nchar或nvarchar
用varchar就会出现楼主的问题。
==============================
varchar 是ascii码的,nvarchar 是unicode
但是不是乱码的原因。

http://www.8esky.com/cms/Site/Article/shjwebkfshjkfaq601/shjkkffaq112/mssqlserver70/ybwh80/23150.html

 

SQL  Server  2000  如何更改字符集?  
从中文改为英文。  
---------------------------------------------------------------  
 
1.在MS-DOS模式下运行:  
c:>net  stop  mssqlserver  
 
2.然后运行//mssql/binn/rebuildm.exe文件重建master库  
字符集选ISO,排序方式二进制,大小写敏感。  

(事实上我的rebuildm.exe文件位于C:/Program Files/Microsoft SQL Server/80/Tools/Binn)
 
3.重建完后在MS-DOS模式下运行:  
c:>net  start  mssqlserver  
 
如果第3步不成功也不要紧,你可以继续执行这句话或者到控制面板中去以图形化方式激活SQL  Server的服务。  

http://hi.baidu.com/zhaoyf/blog/item/ecf25882943dc1a20df4d234.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 字符

http://topic.csdn.net/t/20050404/16/3907657.html

指定   Windows   排序规则   
Chinese_PRC   :   中文(香港特别行政区),中文(中华人民共和国),中文(新加坡)     
Chinese_PRC_Stroke   :   按汉字笔画排序(中华人民共和国)    

你可能感兴趣的:(SQL 字符集的更改)