char,varchar,nvarchar的区别?

本文详细解析了数据库中的字符数据类型,包括char、varchar及nvarchar的区别。探讨了这些类型如何处理ASCII和Unicode字符,以及它们在存储空间上的不同表现。

Varchar 对每个英文(ASCII)字符都占用2个字节,对一个汉字也只占用两个字节
char 对英文(ASCII)字符占用1个字节,对一个汉字占用2个字节

Varchar 的类型不以空格填满,比如varchar(100),但它的值只是"qian",则它的值就是"qian"
而char 不一样,比如char(100),它的值是"qian",而实际上它在数据库中是"qian "(qian后共有96个空格,就是把它填满为100个字节)。
由于char是以固定长度的,所以它的速度会比varchar快得多!但程序处理起来要麻烦一点,要用trim之类的函数把两边的空格去掉! 

N表示Unicode常量,可以解决多语言字符集之间的转换问题,见联机帮助 姓名,和房间通常都是用varchar这个数据类型 

解释一下: 
drop proc a 

varchar(n):变长型字符数据类型,存储最长长度为8,000 个字符。 

举个例子: 
create table a (name1 varchar(8)) 
insert a select '张红a' 
--- 存储长度为5个字节,余下的3个字节全部释放 
insert a select '王一南' 
----存储长度为6个字节,余下的2个字节全部释放 
---意思是varchar变长字符数据类型与存储数据的实际长度是一致的 

nvarchar(n):可变长度 Unicode 数据,其最大长度为 4,000 字符。 
字节的存储大小是所输入字符个数的两倍, 
就是说它是双字节来存储数据的。 
如果存储数据如果存在单字节时,它也是以双字节来占用存储空间的。 

举个例子: 
create table aa (name1 nvarchar(8)) 
insert aa select '张红a' 
--- 存储长度为6个字节,余下的2个字节全部释放

网上可以搜到一大篇,LZ百度一下或者狗哥一下就好了。业精于勤  hoho

【viena】:
char      定长
varchar   变长,ASCII字符只占1个字节
nvarchar  变长Unicode,字符都占2个字节

 

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

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

两字段分别有字段值:我和coffee
那么varchar字段占2×2+6=10个字节的存储空间,而nvarchar字段占8×2=16个字节的存储空间。

如字段值只是英文可选择varchar,而字段值存在较多的双字节(中文、韩文等)字符时用nvarchar

另外,N前缀表示nvarchar,如 N'hello'

# CHAR VARCHAR 数据类型详解 在 SQL 建表语句中,CHARVARCHAR 都是用于存储字符串的数据类型,但它们在存储方式和性能特性上有重要区别: ## 主要区别 | 特性 | CHAR | VARCHAR | |---------------------|-------------------------------|------------------------------| | **存储方式** | 固定长度 | 可变长度 | | **存储空间** | 总是占用定义时的全长 | 仅占用实际数据长度+长度标识(1-2字节) | | **检索速度** | 通常更快 | 稍慢(需要计算实际长度) | | **尾部空格处理** | 自动填充空格到固定长度 | 保留原始长度,不填充空格 | | **最大长度** | MySQL 5.0.3+: 255字符 | MySQL: 65,535字节(受行大小限制) | | **适用场景** | 长度固定的数据(如国家代码) | 长度变化大的数据(如用户名) | ## 详细对比 ### 1. 存储机制 - **CHAR(N)**: - 存储时总是占用 N 个字符的空间 - 如果插入的数据长度小于 N,会用空格填充至 N 长度 - 检索时会去除尾部空格 ```sql CREATE TABLE char_test ( country_code CHAR(3) -- 总是占用3字符空间 ); ``` - **VARCHAR(N)**: - 存储时只占用实际数据长度 + 1或2字节的长度前缀 - 在 MySQL 5.0.3 之前,最大长度为 255 字符 - 之后版本最大可达 65,535 字节(受行大小限制) ```sql CREATE TABLE varchar_test ( username VARCHAR(50) -- 最多占用50字符+长度标识 ); ``` ### 2. 性能差异 - **CHAR**: - 读取速度更快(固定偏移量) - 适合短且长度固定的字符串 - 频繁更新的字段使用 CHAR 可减少碎片 - **VARCHAR**: - 节省存储空间(特别是长字符串) - 适合长度变化大的字符串 - 略微增加存储和检索的开销(需要处理长度前缀) ### 3. 存储示例 假设存储字符串 "ABC": - 在 CHAR(10) 中: - 存储: "ABC " (7个空格填充) - 占用: 10 字符空间 - 在 VARCHAR(10) 中: - 存储: [3字节长度前缀]"ABC" - 占用: 实际4字节(1字节长度前缀+3字符) ## 使用建议 1. **使用 CHAR 的情况**: - MD5 哈希值(总是32字符) - 国家/地区代码(如'CN', 'US') - 性别('M'/'F') - Y/N 标志 - 短且长度固定的标识符 2. **使用 VARCHAR 的情况**: - 用户名、邮箱地址 - 产品描述 - 评论内容 - 任何长度变化大的文本 - 长度可能超过100字符的文本 ## 数据库特定实现 不同数据库系统对 CHARVARCHAR 的实现有细微差别: - **MySQL/MariaDB**: - VARCHAR 最大长度受行大小限制(65,535字节总行大小) - 5.0.3 之前 VARCHAR 最大255字符 - **PostgreSQL**: - 没有 CHARVARCHAR 的性能差异 - CHAR(n) 和 VARCHAR(n) 在存储上几乎相同 - 提供 TEXT 类型用于大文本 - **SQL Server**: - CHARVARCHAR 最大8,000字符 - 提供 VARCHAR(MAX) 和 NVARCHAR(MAX) 用于大文本 - **Oracle**: - CHAR 总是填充到全长 - VARCHAR2 是推荐使用的可变长度类型(Oracle 建议不用 VARCHAR) ## 示例建表语句 ```sql CREATE TABLE user_profiles ( id INT PRIMARY KEY AUTO_INCREMENT, -- 固定长度字段使用CHAR country_code CHAR(2), -- ISO国家代码 gender CHAR(1), -- 'M'或'F' is_active CHAR(1), -- 'Y'或'N' -- 可变长度字段使用VARCHAR username VARCHAR(50) NOT NULL, email VARCHAR(255) NOT NULL, bio VARCHAR(1000), -- 个人简介 -- 创建时间使用固定长度格式 created_at CHAR(19) -- 存储'YYYY-MM-DD HH:MM:SS'格式 ); ``` ## 注意事项 1. 在 MySQL 中,如果启用了 `PAD_CHAR_TO_FULL_LENGTH` SQL 模式,CHAR 类型将保留尾部空格而不进行修剪 2. 对于非常长的字符串,考虑使用 TEXT 类型(MySQL 中 VARCHAR 和 TEXT 在存储方式上有区别,TEXT 有单独的存储区域) 3. 在排序和比较操作中,CHARVARCHAR 的行为可能不同,特别是在不同长度的字符串比较时 4. 索引效率:CHAR 列上的索引通常更紧凑,因为长度固定 5. 存储引擎影响:InnoDB 和 MyISAM 对这些类型的处理可能略有不同
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值