Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节 char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节 Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian" 而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。 由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉! 1、CHAR。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。 2、VARCHAR。存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么“+1”呢?这一个字节用于保存实际使用了多大的长度。 修改前(char) 修改后(varchar) 上面两个图是论坛中网友贴出来的,可以看到修改后pw_user“减肥”效果相当明显。 从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。 3、TEXT。text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。 4、NCHAR、NVARCHAR、NTEXT。这三种从名字上看比前面三种多了个“N”。它表示存储的是Unicode数据类型的字符。我们知道字符中,英文字符只需要一个字节存储就足够了,但汉字众多,需要两个字节存储,英文与汉字同时存在时容易造成混乱,Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。nchar、nvarchar的长度是在1到4000之间。和 char、varchar比较起来,nchar、nvarchar则最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储 8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。 所以一般来说,如果含有中文字符,用nchar/nvarchar,如果纯英文和数字,用char/varchar。将所有的表中,数值类型由char,varchar改为nchar,nvarchar 的存储过程 /*--调用示例: exec p_set --*/ if exists (select * from dbo.sysobjects where id = object_id(N'[dbo].[p_set]') and OBJECTPROPERTY(id, N'IsProcedure') = 1) drop procedure [dbo].[p_set] GO create procedure p_set as declare tb cursor for Select sql='alter table ['+d.name +'] alter column ['+a.name+'] n' +b.name+'('+cast(a.length*2 as varchar)+')' FROM syscolumns a left join systypes b on a.xtype=b.xusertype inner join sysobjects d on a.id=d.id and d.xtype='U' and d.name<>'dtproperties' where b.name in('char','varchar') and not exists(Select 1 FROM sysobjects where xtype='PK' and name in ( Select name FROM sysindexes Where indid in( Select indid FROM sysindexkeys Where id = a.id AND colid=a.colid ))) --主键不能修改 order by d.name,a.name declare @sql varchar(1000) open tb fetch next from tb into @sql while @@fetch_status = 0 begin exec(@sql) fetch next from tb into @sql end close tb deallocate tb go
详细解决方案
SQL中char、varchar 跟nchar、nvarchar的区别,另外加一转换存储过程
热度:102 发布时间:2016-05-05 14:05:36.0
相关解决方案
- 形参类型是 int ,按理只能接受 数值 或 char ,为什么下面传和个 String 也行?解决办法
- oracle 安插 LONG VARCHAR 类型数据
- java调用dll怎么办指针参数?char,int,float三种类型指针在java中怎么替代
- JNI char*转jstring乱码有关问题
- 怎么使用JAVA调用C++编写的Dll函数,Char *指针
- 关于JNI char*转jstring乱码,该如何解决
- char character的差异
- 如何把unsigned char[]插入数据库
- 一个关于“不能将参数 1 从“char [80]”转换为“System:Object ^”的有关问题
- 托管代码数据怎么转非托管数据?array<Byte> 怎样转为 char *
- vc++.net中的有关问题( error C2440: 'type cast' : cannot convert from 'CString' to 'const char *')
- 请问,报不能将“const char [7]”转换为“LPCTSTR”
- main(int, char* argv[]) 跟 main(int, wchar* argv[])
- 如何才能把char * 类型的数据转换成unsigned char _gc[]
- 如何把“char *”转换为“System:String ^”
- 参数化查询 '(@mbox varchar(150),@age int,@address varchar' 亟需参数 '@mbox'但未提供该参数
- .NET代码 new SqlParameter("@tName" SqlDbType.VarChar, max)用什么取代max,该如何解决
- 求教在将 varchar 值转换成数据类型 int 时失败,该怎么处理
- {"将 varchar 值 'P20120717-001' 转换为数据类型为 smallint 的列时发生语法异常。"}
- cmd.Parameters.Add("@uid"SqlDbType.NVarChar,50);这句什么意思?解决办法
- (回帖给分)在将 varchar 值 转换成数据类型 int 时失败。该如何解决
- La conversión del tipo de datos char a smalldatetime generó un valor smalldateti,该如何解决
- 将数据类型 varchar 转换为 numeric 时出错。该怎么解决
- 将 nvarchar 值 'A22' 转换为数据类型为 int 的列时发生语法异常
- The conversion of a char data type to a datetime data type resulted in an out-of-range datetime解决方案
- 是不是写成 varchar(8000) 要比 nvarchar(4000) 能够写更长的SQL字串?解决方法
- 与“string.Split(params char[])”最匹配的重载方法具有一些无效参数,该怎么解决
- 已经把数据表里的字段从nvarchar都改成其他了,数据库也刷新了,再把数据源重新选一遍,但运行程序还是会说第 1 行: 'nvarchar' 附近有语解决思路
- |M| 从零开始学习存储过程第二贴:数据库设计的时候文本小弟我都是用Nvarchar 但小弟我看别人都是用 varchar 那小弟我要用哪一个
- char[] aaa = ""ToCharArray;为什么报错?想用""来分割一个字符串如何做