MySQL----varchar讲解(摘)

本文详细介绍了MySQL中CHAR、VARCHAR及TEXT等数据类型的特性与区别,包括长度限制、存储效率及适用场景,帮助开发者选择合适的数据类型。
1.varchar类型的变化
MySQL 数据库的varchar类型在4.1以下的版本中的最大长度限制为255,其数据范围可以是0~255或1~255(根据不同版本数据库来定)。在 MySQL5.0以上的版本中,varchar数据类型的长度支持到了65535,也就是说可以存放65532个字节的数据,起始位和结束位占去了3个字 节,也就是说,在4.1或以下版本中需要使用固定的TEXT或BLOB格式存放的数据可以使用可变长的varchar来存放,这样就能有效的减少数据库文 件的大小。

MySQL 数据库的varchar类型在4.1以下的版本中,nvarchar(存储的是Unicode数据类型的字符)不管是一个字符还是一个汉字,都存为2个字节 ,一般用作中文或者其他语言输入,这样不容易乱码 ;varchar: 汉字是2个字节,其他字符存为1个字节 ,varchar适合输入英文和数字。

4.0版本以下,varchar(20),指的是20字节,如果存放UTF8汉字时,只能存6个(每个汉字3字节) ;5.0版本以上,varchar(20),指的是20字符,无论存放的是数字、字母还是UTF8汉字(每个汉字3字节),都可以存放20个,最大大小是65532字节 ;varchar(20)在Mysql4中最大也不过是20个字节,但是Mysql5根据编码不同,存储大小也不同,具体有以下规则:

a) 存储限制

varchar 字段是将实际内容单独存储在聚簇索引之外,内容开头用1到2个字节表示实际长度(长度超过255时需要2个字节),因此最大长度不能超过65535。

b) 编码长度限制

字符类型若为gbk,每个字符最多占2个字节,最大长度不能超过32766;

字符类型若为utf8,每个字符最多占3个字节,最大长度不能超过21845。

若定义的时候超过上述限制,则varchar字段会被强行转为text类型,并产生warning。

c) 行长度限制

导致实际应用中varchar长度限制的是一个行定义的长度。 MySQL要求一个行的定义长度不能超过65535。若定义的表长度超过这个值,则提示

ERROR 1118 (42000): Row size too large. The maximum row size for the used table type, not counting BLOBs, is 65535. You have to change some columns to TEXT or BLOBs。

2.CHAR(M), VARCHAR(M)不同之处
CHAR(M)定义的列的长度为固定的,M取值可以为0~255之间,当保存CHAR值时,在它们的右边填充空格以达到指定的长度。当检索到CHAR值时,尾部的空格被删除掉。在存储或检索过程中不进行大小写转换。CHAR存储定长数据很方便,CHAR字段上的索引效率级高,比如定义char(10),那么不论你存储的数据是否达到了10个字节,都要占去10个字节的空间,不足的自动用空格填充。

VARCHAR(M)定义的列的长度为可变长字符串,M取值可以为0~65535之间,(VARCHAR的最大有效长度由最大行大小和使用的字符集确定。整体最大长度是65,532字节)。VARCHAR值保存时只保存需要的字符数,另加一个字节来记录长度(如果列声明的长度超过255,则使用两个字节)。VARCHAR值保存时不进行填充。当值保存和检索时尾部的空格仍保留,符合标准SQL。varchar存储变长数据,但存储效率没有CHAR高。如果一个字段可能的值是不固定长度的,我们只知道它不可能超过10个字符,把它定义为 VARCHAR(10)是最合算的。VARCHAR类型的实际长度是它的值的实际长度+1。为什么"+1"呢?这一个字节用于保存实际使用了多大的长度。从空间上考虑,用varchar合适;从效率上考虑,用char合适,关键是根据实际情况找到权衡点。

CHAR和VARCHAR最大的不同就是一个是固定长度,一个是可变长度。由于是可变长度,因此实际存储的时候是实际字符串再加上一个记录字符串长度的字节(如果超过255则需要两个字节)。如果分配给CHAR或VARCHAR列的值超过列的最大长度,则对值进行裁剪以使其适合。如果被裁掉的字符不是空格,则会产生一条警告。如果裁剪非空格字符,则会造成错误(而不是警告)并通过使用严格SQL模式禁用值的插入。

3. VARCHAR和TEXT、BlOB类型的区别
VARCHAR,BLOB和TEXT类型是变长类型,对于其存储需求取决于列值的实际长度(在前面的表格中用L表示),而不是取决于类型的最大可能尺寸。例如,一个VARCHAR(10)列能保存最大长度为10个字符的一个字符串,实际的存储需要是字符串的长度 ,加上1个字节以记录字符串的长度。对于字符串'abcd',L是4而存储要求是5个字节。

BLOB和TEXT类型需要1,2,3或4个字节来记录列值的长度,这取决于类型的最大可能长度。VARCHAR需要定义大小,有65535字节的最大限制;TEXT则不需要。如果你把一个超过列类型最大长度的值赋给一个BLOB或TEXT列,值被截断以适合它。

一个BLOB是一个能保存可变数量的数据的二进制的大对象。4个BLOB类型TINYBLOB、BLOB、MEDIUMBLOB和LONGBLOB仅仅在他们能保存值的最大长度方面有所不同。

BLOB 可以储存图片,TEXT不行,TEXT只能储存纯文本文件。4个TEXT类型TINYTEXT、TEXT、MEDIUMTEXT和LONGTEXT对应于4个BLOB类型,并且有同样的最大长度和存储需求。在BLOB和TEXT类型之间的唯一差别是对BLOB值的排序和比较以大小写敏感方式执行,而对TEXT值是大小写不敏感的。换句话说,一个TEXT是一个大小写不敏感的BLOB。

4.总结char,varchar,text区别
长度的区别,char范围是0~255,varchar最长是64k,但是注意这里的64k是整个row的长度,要考虑到其它的column,还有如果存在not null的时候也会占用一位,对不同的字符集,有效长度还不一样,比如utf8的,最多21845,还要除去别的column,但是varchar在一般情况下存储都够用了。如果遇到了大文本,考虑使用text,最大能到4G。

效率来说基本是char>varchar>text,但是如果使用的是Innodb引擎的话,推荐使用varchar代替char

char和varchar可以有默认值,text不能指定默认值

数据库选择合适的数据类型存储还是很有必要的,对性能有一定影响。这里在零碎记录两笔,对于int类型的,如果不需要存取负值,最好加上unsigned;对于经常出现在where语句中的字段,考虑加索引,整形的尤其适合加索引。
<think>好的,我现在需要处理用户关于MySQL基础知识的查询。首先,用户提供了三个引用内容,我需要仔细分析这些引用,看看它们提供了哪些信息。 引用[1]提到会带领大家认识和使用数据库的相关概念和基本操作,并提到初始MySQL的框架。引用[2]是关于MySQL基础入门的,包括数据库操作、表操作和SQL数据类型,还提到MySQL的架构。引用[3]则涉及安装和环境变量配置,以及如何通过命令行连接MySQL。 用户的问题是想了解初识MySQL的基础教程。根据引用内容,我应该组织一个结构清晰的回答,涵盖MySQL的基本概念、架构、安装步骤、基本操作如数据库和表的创建,以及简单的SQL语句。同时,需要按照用户的要求,使用正确的LaTeX格式,生成相关问题,并在引用处添加标识。 首先,我需要确认MySQL的基础知识通常包括哪些部分。根据引用内容,可能包括MySQL的架构、安装配置、数据库和表的操作、数据类型等。然后,我需要将这些内容分步骤解释,确保每个部分都简明扼要,并正确引用来源。 需要注意的是,用户要求行内数学表达式用$...$,独立公式用$$...$$,虽然MySQL基础知识可能涉及较少的数学公式,但如果提到比如索引的算法或其他需要公式的地方,需要正确应用格式。不过当前引用内容中没有涉及复杂公式,可能可以忽略,但需保持警惕。 另外,回答需要生成相关问题。根据引用内容中的主题,相关问题可能涉及架构的细节、安装步骤的详细说明、SQL语句的具体用法,以及优化方法等。 在结构上,应该按照用户示例中的方式,先给出回答,再列出相关问题。回答需要分点,如MySQL简介、架构、安装配置、基本操作等。每个部分引用对应的引用来源。 现在,我需要确保所有引用都被正确标注。例如,在提到MySQL架构时,需要引用[^2],在安装步骤引用[^3],在基本操作部分引用[^1]和[^2]。 可能还需要检查是否有遗漏的信息,比如SQL数据类型在引用[2]中提到,应该在回答中包括这部分内容,并引用。 最后,生成的相关问题需要与回答内容相关,可能包括如何安装MySQLMySQL架构的组成部分、数据库操作的具体步骤、SQL数据类型有哪些等。 总结步骤: 1. 简介MySQL及其重要性。 2. 讲解MySQL的架构,引用。 3. 安装和环境配置步骤,引用[^3]。 4. 数据库操作,如创建、使用数据库,引用。 5. 表操作和数据类型,引用。 6. 基本SQL语句示例。 7. 生成相关问题,覆盖架构、安装、操作、数据类型等。 需要确保每个引用标记自然出现在相关段落末尾,语言口语化,避免使用Markdown格式,符合用户的要求。</think>### 初识 MySQL 基础教程 #### 1. **MySQL 简介** MySQL 是最流行的开源关系型数据库管理系统之一,支持跨平台运行,广泛用于 Web 开发、数据分析等领域。其核心特点包括高性能、易用性和可扩展性。 #### 2. **MySQL 架构** MySQL 采用分层架构,主要分为: - **连接层**:管理客户端连接(如通过命令行或应用程序)[^3]。 - **服务层**:处理 SQL 解析、查询优化等核心功能。 - **存储引擎层**:负责数据存储和检索(如 InnoDB、MyISAM)[^2]。 #### 3. **安装与配置** - **安装步骤**:从官网下载对应操作系统的安装包,按向导完成安装。 - **配置环境变量**(Windows 示例): 将 MySQL 的 `bin` 目录(如 `C:\Program Files\MySQL\MySQL Server 8.0\bin`)添加到系统环境变量。 - **连接数据库**: ```bash mysql -h 127.0.0.1 -P 3306 -u root -p ``` 输入密码后即可进入交互界面。 #### 4. **数据库操作** - **创建数据库**: ```sql CREATE DATABASE mydb; ``` - **切换数据库**: ```sql USE mydb; ``` - **删除数据库**: ```sql DROP DATABASE mydb; ``` 以上操作需通过 SQL 语句执行[^1]。 #### 5. **表操作与数据类型** - **创建表**(示例): ```sql CREATE TABLE users ( id INT PRIMARY KEY AUTO_INCREMENT, name VARCHAR(50) NOT NULL, age INT, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ); ``` - **常见数据类型**: - 整数:`INT`, `TINYINT` - 字符串:`VARCHAR(n)`, `TEXT` - 日期时间:`DATE`, `DATETIME` - 浮点数:`FLOAT`, `DECIMAL` #### 6. **基本 SQL 语句** - **插入数据**: ```sql INSERT INTO users (name, age) VALUES ('Alice', 25); ``` - **查询数据**: ```sql SELECT * FROM users WHERE age > 20; ``` - **更新数据**: ```sql UPDATE users SET age = 26 WHERE name = 'Alice'; ``` - **删除数据**: ```sql DELETE FROM users WHERE id = 1; ``` --- ###
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值