GVKun编程网logo

sql varchar(max)vs varchar(fix)

18

对于想了解sqlvarchar(max)vsvarchar(fix)的读者,本文将提供新的信息,并且为您提供关于char,nchar,varchar,nvarchar的区别和特点_MySQL、mysq

对于想了解sql varchar(max)vs varchar(fix)的读者,本文将提供新的信息,并且为您提供关于char,nchar,varchar,nvarchar的区别和特点_MySQL、mysql中char、varchar、nvarchar数据类型的用法区别、MySQL中char、varchar和nvarchar的区别、MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊的有价值信息。

本文目录一览:

sql varchar(max)vs varchar(fix)

sql varchar(max)vs varchar(fix)

每次我混淆选择varchar(max)或varchar(fix)数据类型.假设我有一个大约5000 varchar的数据列.列不是null类型.

我应该设置varchar(max)not null或varchar(5000)not null.

在可以为空的数据类型的情况下也是如此.

CREATE TABLE [dbo].[tblCmsPages](
[CmsPagesID] [int] IDENTITY(1,1) NOT NULL,[PageName] [varchar](250) NOT NULL,[PageContent] [varchar](max) NOT NULL,[Sorting] [int] NOT NULL,[IsActive] [bit] NOT NULL)

//要么

CREATE TABLE [dbo].[tblCmsPages](
[CmsPagesID] [int] IDENTITY(1,[PageContent] [varchar](5000) NOT NULL,[IsActive] [bit] NOT NULL

// [PageContent]将是5000个char或单个char或null然后我应该采取什么.

彼此想我想知道. null和not null之间的主要区别是什么.它仅用于验证检查以及对性能的影响.

解决方法

MSDN

>当列数据条目的大小不同时使用varchar
相当.
>当列数据条目的大小变化时,使用varchar(max)
相当大,大小可能超过8,000字节.

如果在声明VARCHAR变量或列中指定了长度,则允许的最大长度为8000.如果长度大于8000,则必须使用MAX说明符作为长度.如果指定的长度大于8000,则会遇到以下错误(假设指定的长度为10000):

The size (10000) given to the type ‘varchar’ exceeds the maximum allowed for any data type (8000).

更新: –
我找到了一个我想分享的链接: –

Here

Varchar [(n)]和Varchar(Max)之间没有太大的性能差异.与Varchar(Max)相比,Varchar [(n)]提供了更好的性能结果.如果我们知道要存储在列或变量中的数据小于或等于8000个字符,那么与Varchar(Max)相比,使用此Varchar [(n)]数据类型可提供更好的性能.例如:当我运行以下内容时脚本通过将变量@FirstName类型更改为Varchar(Max)然后为100万个赋值,它始终比我们使用数据类型的时间多一倍

Varchar(50) for variable @ FirstName.
DECLARE @FirstName VARCHAR(50),@COUNT INT=0,@StartTime DATETIME = GETDATE()
WHILE(@COUNT < 1000000)
BEGIN
SELECT @FirstName = 'Suraj',@COUNT = @COUNT +1
END
SELECT DATEDIFF(ms,@StartTime,GETDATE()) 'Time Taken in ms'
GO

char,nchar,varchar,nvarchar的区别和特点_MySQL

char,nchar,varchar,nvarchar的区别和特点_MySQL

  对于程序中的string型字段,SQLServer中有char、varchar、nchar、nvarchar四种类型来对应(暂时不考虑text和ntext),开建立数据库中,对这四种类型往往比较模糊,这里做一下对比。

定长或变长

  所谓定长就是长度固定的,当输入的数据长度没有达到指定的长度时将自动以英文空格在其后面填充,使长度达到相应的长度;有var前缀的,表示是实际存储空间是变长的,比如varchar,nvarchar变长字符数据则不会以空格填充,比较例外的是,text存储的也是可变长。

Unicode或非Unicode

  数据库中,英文字符只需要一个字节存储就足够了,但汉字和其他众多非英文字符,则需要两个字节存储。如果英文与汉字同时存在,由于占用空间数不同,容易造成混乱,导致读取出来的字符串是乱码。Unicode字符集就是为了解决字符集这种不兼容的问题而产生的,它所有的字符都用两个字节表示,即英文字符也是用两个字节表示。而前缀n就表示Unicode字符,比如nchar,nvarchar,这两种类型使用了Unicode字符集。

基于以上两点来看看字段容量

  char,varchar 最多8000个英文,4000个汉字
  nchar,nvarchar 可存储4000个字符,无论英文还是汉字

char、varchar、nchar、nvarchar特点比较

  CHAR

  CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间。

  VARCHAR

  存储变长数据,但存储效率没有CHAR高,如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么”+1″呢?这一个字节用于保存实际使用了多大的长度。

  从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

  TEXT

  text存储可变长度的非Unicode数据,最大长度为2^31-1(2,147,483,647)个字符。

  NCHAR、NVARCHAR、NTEXT

  这三种从名字上看比前面三种多了个”N”。和char、varchar比较起来,nchar、nvarchar最多存储4000个字符,不论是英文还是汉字;而char、varchar最多能存储8000个英文,4000个汉字。可以看出使用nchar、nvarchar数据类型时不用担心输入的字符是英文还是汉字,较为方便,但在存储英文时数量上有些损失。

使用参考(个人偏好)

  一般来说,如果含有中文字符,用nchar/nvarchar。

  如果纯英文和数字,用char/varchar。

  如果数据量非常大,又能100%确定长度且保存只是ansi字符,那么char。

  能确定长度又不一定是ansi字符或者,那么用nchar;

  对于超大数据,如文章内容,使用nText。

  其他的通用nvarchar。

mysql中char、varchar、nvarchar数据类型的用法区别

mysql中char、varchar、nvarchar数据类型的用法区别

mysql中char、varchar、nvarchar数据类型的用法区别 有需要的朋友可

说明:
1、char:
固定长度的非 Unicode 字符数据,最大长度为 8,000 个字符。
2、varchar:
可变长度的非 Unicode 数据,最长为 8,000 个字符。
3、nvarchar:
可变长度 Unicode 数据,其最大长度为 4,000 字符。
4、nchar
固定长度的 Unicode 数据,最大长度为 4,000 个字符。
5、char和varchar都是字符串类型的
用Unicode编码的字符串,结果是字符的整数值


如有以下数据结构:

工号 姓名 部门
———————–
1 张三 财务
2 李四 人事
3 王五 销售
……..

我们定义”姓名”为char(10)(静态)的时简单地用php代码表示:
简单地模拟底层数据存储链表$data

 代码如下 复制代码
$col_num_len  =1;      //工号长度为1
$col_name_len=10;    //姓名长度为10
$col_unit_len   =4;     //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;       

  //表示每笔记录的总长度,包括3个分隔符
实现如下:

 代码如下 复制代码

$data="1|张三      |财务|2|李四      |人事|3|王五      |销售|...";         //简单地模拟底层数据存储链表

//假设查找第2条记录的"姓名"字段数据
$record_start=$col_len*1+1;                                                       //获取第2行的起始位置
$record  =substr($data,$record_start,$col_len);                        //获取第2条记录
$col_name_start=$col_num_len+2;                                                   //获取"姓名"字段的起始位置
$col_name=substr($record,$col_name_start,$col_name_len);  //获取"姓名"字段的数据
echo $col_name;

-----------

 代码如下 复制代码
//假设更新第2条记录的"姓名"字段数据为"李小四"
$update_info="李小四";
$data=substr_replace($data,$update_info,$col_name_start,$col_name_len);        //更新字段,流程结束
而如果我们定义”姓名”字段为varchar(10)(动态)的时候情况则要复杂:
注意存储”姓名”的字段没有空格,这是char和varchar的存储区别
$col_num_len  =1;      //工号长度为1
$col_name_len=10;    //姓名长度为10
$col_unit_len   =4;     //部门长度为4
$col_len=$col_num_len+$col_name_len+$col_unit_len+3;

实现如下:

 代码如下 复制代码

//动态存放数据行的起始位置,数据为更新时生成(重新)
$record_1_start=1;$record_1_name_dynamic_len=4;                //$col_1_name_dynamic_len记录"姓名"动态字段的长度
$record_2_start=13;$record_2_name_dynamic_len=4;
$record_3_start=26;$record_3_name_dynamic_len=6;
...

$data="1|张三|财务|2|李四|人事|3|王小明|销售|...";                       //简单地模拟底层数据存储链表,注意存储"姓名"的字段没有空格

//假设查找第2条记录的"姓名"字段数据
$record_2_end=$record_3_start-1;                                               //获取第2行的结束位置
$record  =substr($data,$record_2_start,$record_2_end);         //获取第2条记录
$col_name_start=$col_num_len+2;                                                   //获取"姓名"字段的起始位置
$col_name=substr($record,$col_name_start,$record_2_name_dynamic_len);  //获取"姓名"字段的数据
echo $col_name;

//假设更新第2条记录的"姓名"字段数据为"李小四",这边比静态的复杂很多
$update_info="李小四";
$update_len=strlen($update_info);                //获取更新内容的长度
if($diff_len=$update_len-$record_2_name_dynamic_len)
{
$data=substr_replace($data,"",$col_name_start,$record_2_name_dynamic_len);        //清除原先数据
$record_2_name_dynamic_len=$update_len;                                                                        //更新字段的长度(并存储新值)

//在此假设总记录数为n
for($i=2;$i {
${''record_''.$i.''_start''}=${''record_''.$i.''_start''}+$diff_len;                                        //重新更新每个行的起始位置(并存储新值),系统开销大(实际上有不同的方法解决)
}
}

$data=substr_replace($data,$update_info,$col_name_start,0);


文中直接使用”substr_replace”,而在数据量很大的时候,底层实现上的开销也是不小的,在mysql中表现为(Row Migration)现象,在此不作赘述

根据以上的粗略实现证明:
1、varchar类型在更新环节上的系统开销是远大于char类型的。
2、两者间查找搜索性能上是不相上下的。
3、两者间的存储数据量($data)环节上,char要显示大于varchar。
4、大数据量提取时varchar的磁盘IO消耗更低,意味着varchar综合查询性能会更好。
5、没有了。

实际应用中的结论(如在mysql中):
1、char适合字段频繁更新时的应用。
2、varchar更节省磁盘空间。
3、实际应用中大数据量(多行)查询返回,varchar的查询性能比起char来要好出不少。
4、选择char和varchar会改变整体数据结构的算法以及存储方式。在mysql应用中,如已存在varchar字段,那么其它所有的char字段将以varchar方式存储。
5、没有了。

(以上算法仅以PHP简单描述,欢迎更好的思路加以指教)

注:此文原作者的写作时间比较久远了,所以有些地方和现在的有些出入,体现在:

1.在innodb引擎中,char和varchar的实现已无异,效率上并没多大区别。
2.选择char和varchar并不会改变整体数据结构的算法以及存储方式。(我记得这是在MYSQL4里的特性,网上的老文章有讲述,到了MYSQL5实测已无此特性)


总结分析:
文字字段若长度固定,如:身分证号码,就不要用 varchar 或 nvarchar,应该用 char 或 nchar。
支持多语言的站点应考虑使用 Unicode nchar 或 nvarchar 数据类型以尽量减少字符转换问题
文字字段若长度不固定,如:地址,则该用 varchar 或 nvarchar。除了可节省存储空间外,存取硬盘时也会较有效率

MySQL中char、varchar和nvarchar的区别

MySQL中char、varchar和nvarchar的区别

一、char和varchar的区别
char是固定长度的,而varchar会根据具体的长度来使用存储空间,另外varchar需要用额外的1-2个字节存储字符串长度。
1). 当字符串长度小于255时,用额外的1个字节来记录长度
2). 当字符串长度大于255时,用额外的2个字节来记录长度
比如char(255)和varchar(255),在存储字符串"hello world"时,char会用一块255个字节的空间放那个11个字符;而varchar就不会用255个,它先计算字符串长度为11,然后再加上一个记录字符串长度的字节,一共用12个字节存储,这样varchar在存储不确定长度的字符串时会大大减少存储空间。

二、varchar和nvarchar的区别
1. varchar(n):长度为n个字节的可变长度且非Unicode的字符数据。n必须是一个介于1和8,000之间的数值。存储大小为输入数据的字节的实际长度

2. nvarchar(n):包含n个字符的可变长度Unicode字符数据。n的值必须介于1与4,000之间。字节的存储大小是所输入字符个数的两倍。所输入的数据字符长度可以为零。

三、char和varchar的使用场景
1. 从字符长度的角度考虑:
(1). 长度较短的字段,使用char。如门牌号:101,201,...
(2). 固定长度的字段,使用char。如性别、身份证号、手机号等。(因为数据都是固定长度,varchar根据长度动态存储的特性就没作用了,而且还要占一个字节来存储长度)
(3). 字段的长度是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。

2. 从碎片角度考虑:
使用CHAR时,由于存储空间都是一次性分配的。从这个角度来讲,不存在碎片的困扰。而使用varchar时,因为存储的长度是可变的,当数据长度在更改前后不一致时,就不可避免地会出现碎片的问题。故使用varchar时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业来消除碎片。

3. 即使使用Varchar数据类型,也不能够太过于慷慨。
虽然varchar可以自动根据长度调整存储空间,但是varchar(100)和varchar(255)还是有区别的:
假设它们都存储了90个字符的数据,那么它们在磁盘上的存储空间是相同的(硬盘上的存储空间是根据实际字符长度来分配存储空间的)。但对于内存来说,则不是这样的,内存是使用varchar中定义的长度(这里为100或255)的内存块来保存值。
所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR的长度时仍然不能过于慷慨,需要评估实际需要的长度,然后设置一个合适的长度,不能随意设置长度。

四、varchar和nvarchar的使用场景
1. nvarchar适用中文和其他字符,其中N表示Unicode编码,可以解决多语言之间的转换问题

参考:https://www.jb51.net/article/55366.htm

MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊

MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊

一般初学会认为,二者占用的空间是一样的。比如说我存储5个char,二者都是实际占用了5个char了【勘误:varchar在实际存储的时候会多一个byte用来存放长度】。
但是深入一下,设计数据库的时候,二者一样吗?
答案是否定的【至少varchar类型需要在数据之前利用一个或者两个字节来存储数据的长度】【二者在内存中的操作方式也是不同的,下面的例子中有体现】。
看下面的例子
如现在用户需要存储一个地址信息。根据评估,只要使用100个字符就可以了。但是有些数据库管理员会认为,反正Varchar数据类型是根据实际的需要来分配长度的。还不如给其大一点的呢。为此他们可能会为这个字段一次性分配200个字符的存储空间。这VARCHAR(100)与VARCHAR(200)真的相同吗?结果是否定的。虽然他们用来存储90个字符的数据,其存储空间相同。但是对于内存的消耗是不同的。对于VARCHAR数据类型来说,硬盘上的存储空间虽然都是根据实际字符长度来分配存储空间的,但是对于内存来说,则不是。其时使用固定大小的内存块来保存值。简单的说,就是使用字符类型中定义的长度,即200个字符空间。显然,这对于排序或者临时表(这些内容都需要通过内存来实现)作业会产生比较大的不利影响。解释可以参见这里所以如果某些字段会涉及到文件排序或者基于磁盘的临时表时,分配VARCHAR数据类型时仍然不能够太过于慷慨。还是要评估实际需要的长度,然后选择一个最长的字段来设置字符长度。如果为了考虑冗余,可以留10%左右的字符长度。千万不能认为其为根据实际长度来分配存储空间,而随意的分配长度,或者说干脆使用最大的字符长度。
----------------------------------char------------------------------------------
1、从碎片角度进行考虑,使用CHAR字符型时,由于存储空间都是一次性分配的。为此某个字段的内容,其都是存储在一起的。单从这个角度来讲,其不存在碎片的困扰。而可变长度的字符数据类型,其存储的长度是可变的。当其更改前后数据长度不一致时,就不可避免的会出现碎片的问题。故使用可变长度的字符型数据时,数据库管理员要时不时的对碎片进行整理。如执行数据库导出导入作业,来消除碎片。
2、考虑其长度的是否相近,如果某个字段其长度虽然比较长,但是其长度总是近似的,如一般在90个到100个字符之间,甚至是相同的长度。此时比较适合采用CHAR字符类型。比较典型的应用就是MD5哈希值。当利用MD5哈希值来存储用户密码时,就非常使用采用CHAR字符类型。因为其长度是相同的。另外,像用来存储用户的身份证号码等等,一般也建议使用CHAR类型的数据。
另外请大家考虑一个问题,CHAR(1)与VARCHAR(1)两这个定义,会有什么区别呢?虽然这两个都只能够用来保存单个的字符,但是VARCHAR要比CHAR多占用一个存储位置。这主要是因为使用VARCHAR数据类型时,会多用1个字节用来存储长度信息。这个管理上的开销char字符类型是没有的。

---------------------------------总结---------------------------------------------

二者在磁盘上存储占的空间是一样的。区别有二。第一、一个变长一个固定长度。第二、在内存中的操作方式,varchar也是按照最长的方式在内存中进行操作的。比如说要进行排序的时候,varcahr(100)是按照100这个长度来进行的。

-----------------------------------------------------------------------------------

varchar的最大长度是多少呢?

参见这里

mysql的vachar字段的类型虽然最大长度是65535,但是并不是能存这么多数据,最大可以到65533(不允许非空字段的时候),当允许非空字段的时候只能到65532【在允许空的时候,varchar(65532) will be 2 bytes (length) + up to 65532 chars (latin1) + 1 null byte】【还不清楚这一个null byte的作用是什么。后续了解】。

-------------------------------------------------------------------------------------

请注意所有MySQL校对规则属于PADSPACE类。这说明在MySQL中的所有CHAR和VARCHAR值比较时不需要考虑任何尾部空格。请注意所有MySQL版本均如此,并且它不受SQL服务器模式的影响。【参见这里的note部分上面几行文字】

下图为证:

根据上面地址提供的mysql手册,如果在一个char或者varchar列上建立唯一索引之后,那么''a''和''a '',会引起duplicate-key error。


今天关于sql varchar(max)vs varchar(fix)的分享就到这里,希望大家有所收获,若想了解更多关于char,nchar,varchar,nvarchar的区别和特点_MySQL、mysql中char、varchar、nvarchar数据类型的用法区别、MySQL中char、varchar和nvarchar的区别、MySql中varchar(10)和varchar(100)的区别==>>以及char的利弊等相关知识,可以在本站进行查询。

本文标签: