何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解决方案,提供直观的可视化数据编辑器,可帮助您以最方便的方式管理所有类型的数据以及执行所有其他数据库开发、管理和管理任务。
dbForge Studio for for SQL Sever最新版试用
数据类型是一种特殊的数据项,由其可以采用的值和可以对其执行的操作定义。SQL 支持各种数据类型,包括数字、日期和时间、字符和字符串、二进制等。数据类型的选择会影响数据完整性、存储和性能;最佳数据类型的选择并不总是那么明显。
本文将重点介绍三种常用的数据类型:CHAR、VARCHAR和VARCHAR(MAX),比较和讨论它们的特点和用途。
SQL 中的字符数据类型
字符数据类型存储字母数字数据,包括字母、数字、符号和空格。这些类型可以是固定大小 (CHAR) 或可变大小 (VARCHAR)。自 SQL Server 2019 起,字符数据类型支持使用 UTF-8 编码的所有 Unicode 字符。但是,如果应用了非 UTF-8 排序规则,CHAR 和 VARCHAR 将仅存储该排序规则的相应代码页支持的字符子集。
选择最佳字符数据类型很重要,原因如下:
- 查询性能:数据类型的选择会影响性能。例如,CHAR 可以更快,因为它避免了长度计算,而 VARCHAR 更适合具有不同数据长度的列。
- 数据完整性:字符数据类型确保文本数据满足特定规则,例如遵守最大长度。然而,这有时会导致与其他数据库或系统的兼容性问题。
- 存储效率:数据类型直接影响存储要求。例如,CHAR(50) 始终分配 50 个字节,而不管实际数据长度是多少,而 VARCHAR(50) 仅使用实际数据所需的空间加上 2 个字节。
让我们更深入地了解字符数据类型的具体内容。
CHAR – 固定长度数据类型
CHAR(n) 数据类型专为固定长度的非 Unicode 字符数据而设计,其中n指定字符串大小(以字节为单位)(范围从 1 到 8,000)。它可以存储任何字符 - 字母、数字、符号,甚至空字符。如果存储的数据短于定义的长度,数据库会用空格填充以满足固定长度。
CHAR 数据类型适用于保持一致长度的数据,例如电话号码或邮政编码。
CHAR 的优势
- 统一数据长度:CHAR 适合存储大小一致的标准化标识符
- 可预测的存储:固定长度可以更容易地确定所需的存储并优化性能
- 访问速度更快:不需要进行可变长度的计算,从而略微提高速度
- 更简单的索引:固定长度的数据允许统一的索引条目,从而可以提高索引速度
- 减少行碎片:在高更新环境中,CHAR 列不太容易出现碎片
- 数据完整性:CHAR 可以存储空格而不是 NULL,从而实现非空约束,而无需对空值进行复杂的处理
CHAR 的缺点
- 用空格填充:长度小于定义长度的数据将自动用空格填充,这可能会使检索变得复杂
- 更高的磁盘使用率:CHAR 列会消耗更多存储空间,尤其是当许多条目短于定义的长度时
- 灵活性降低:模式匹配等操作可能由于尾随空格而需要额外修剪
- 固定设计:更改 CHAR 列的长度需要更改架构,这可能很麻烦
CHAR 通常用于小型、频繁查询的查找表,例如用于状态跟踪或代码验证的查找表。固定长度可提高性能,当数据完整性和可预测架构比存储效率更重要时,CHAR 是理想之选。但是,CHAR 不太适合长度不等的数据,在这种情况下,建议使用 VARCHAR 作为更灵活且存储效率更高的选项。
VARCHAR – 可变长度数据类型
VARCHAR 是一种可变长度的字符串数据类型,最大长度为 8,000 个字符。它可以存储任何字符,包括数字、字母、特殊字符、非打印字符和 ASCII 空字符。
VARCHAR 字符串中的每个字符占用 1 个字节。与固定长度的列不同,VARCHAR 仅占用存储实际数据所需的空间,而无需填充。尽管由于长度计算,VARCHAR 的性能可能略低于 CHAR,但 VARCHAR 可显著节省存储空间。
VARCHAR 的优点
- 高效存储:VARCHAR 仅将空间用于存储数据,而 CHAR 则不同,即使数据较短,它也会始终分配固定大小
- 灵活性:VARCHAR 非常适合可变长度的数据,例如名称、地址和描述
- 提高较小数据的性能:无需处理空白空间,计算可避免不必要的 I/O 和内存使用
- 可调长度:您可以设置最大长度(如 VARCHAR(255)),从而根据预期数据大小控制存储
VARCHAR 的缺点
- 潜在的性能影响:处理可变长度可能会增加内存管理的复杂性,并减慢从大表中检索数据的速度
- 索引挑战:VARCHAR 列上的索引可能比固定长度列上的索引更慢且效率更低,尤其是在大型数据集中
- 排序和比较开销:由于长度可变,对 VARCHAR 数据进行排序和比较可能需要额外的处理
- 对于持续较短的数据,效率低下:如果 VARCHAR 字段中的数据通常短于最大长度,则 CHAR 可能更高效
- 数据截断风险:如果数据长度超过指定的最大值,则可能会发生截断,从而导致数据丢失
虽然 VARCHAR 具有许多优点,但对于索引量很大的大型应用程序或长度变化最小的数据来说,它可能不是最佳选择。在这种情况下,CHAR 或其他数据类型可能更有效。
VARCHAR(MAX) – 最大文本存储
VARCHAR(MAX) 数据类型支持最大 2 GB 的可变长度字符串,非常适合存储大量文本。
注意事项:
- VARCHAR(MAX) 列不允许固定长度限制
- VARCHAR(MAX) 列不能用作索引中的键列
VARCHAR(MAX) 的优点
- 灵活的数据大小:VARCHAR(MAX) 容量高达 2 GB,适用于需要存储高度可变文本(如评论或注释)的应用程序
- 优化空间:较小的 VARCHAR(MAX) 值与其他数据一起存储在行内,当数据超过 8 KB 时,会移出行外,并在适当位置存储一个指针
- 减少架构更改:使用 VARCHAR(MAX) 可最大限度地减少数据增长时架构更新的需要
- 存储 JSON 或 XML 数据:VARCHAR(MAX) 非常适合存储大型、可变长度的 JSON 或 XML 数据
VARCHAR(MAX) 的缺点
- 潜在的性能影响:VARCHAR(MAX) 可能会降低查询性能,尤其是在不需要大量数据存储时
- 索引受限:VARCHAR(MAX) 列不能直接被索引,这限制了它们在搜索、过滤和排序操作中的有效性
- 内存使用率高:加载多个大字符串会给服务器内存造成压力,而将数据移出行外需要额外的指针存储空间
- 兼容性问题:GROUP BY 和 DISTINCT 等操作可能未针对长度高度可变的 VARCHAR(MAX) 列进行完全优化
- 锁定冲突:在 VARCHAR(MAX) 列中存储和更新大量数据可能会导致表或页面锁定,从而降低性能
- 数据过载的风险:如果没有长度限制,很容易插入超过必要数量的数据,从而影响数据一致性
VARCHAR(MAX) 数据类型有助于处理大型文本数据,但应谨慎使用。当数据长度变化很大且可能超过 8,000 字节时,它最合适。对于较小、可预测的文本大小,固定长度的 CHAR 字段通常更有效。
TEXT – 已弃用的大型文本数据类型
TEXT 数据类型用于存储大量文本数据,包括区域设置支持的单字节和多字节字符。一个表最多可以包含 195 个 TEXT 数据类型的列。
在 SQL Server 中,自 SQL Server 2005 起已弃用 TEXT 数据类型。Microsoft 建议使用 VARCHAR(MAX) 或 NVARCHAR(MAX) 进行开发,因为在即将推出的 SQL Server 版本中将删除对 TEXT 数据类型的支持。
CHAR、VARCHAR 和 VARCHAR(MAX) 之间的区别
下表描述了 CHAR、VARCHAR 和 VARCHAR(MAX) 数据类型之间的区别:
使用字符数据类型时的常见错误
使用 CHAR、VARCHAR 和 VARCHAR(MAX) 可能会导致数据库专家应注意的特定错误。下面,我们将介绍与这些数据类型相关的最常见问题以及如何解决这些问题。
- 截断错误:当用户尝试插入长度超过 CHAR 或 VARCHAR 列定义长度的字符串时,会发生截断,从而导致数据被截断。为防止这种情况,请确保数据长度与列允许的长度相匹配。
- VARCHAR(MAX) 的误用:VARCHAR(MAX) 经常被误用,例如对于包含小型固定大小数据的列,CHAR 是合适的。将数据类型与目标数据相匹配至关重要。
- CHAR 中的尾随空格:CHAR 数据类型会用空格填充字符串以达到指定的长度,这可能会导致比较和 JOIN 中出现意外行为。为避免这些问题,请对不需要填充的可变长度字符串使用 VARCHAR。
- 数据迁移和兼容性问题:从其他系统迁移数据可能会导致 CHAR 和 VARCHAR 值不一致,从而导致截断或填充问题。在开始迁移过程之前,请标准化数据长度和格式,以尽量减少这些问题。
如何选择正确的数据类型
之前,我们讨论了 CHAR、VARCHAR 和 VARCHAR(MAX) 用法的各个方面。选择正确的类型取决于数据特征、长度要求、存储和性能考虑。下表总结了这些信息。
结论
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。本文介绍了这些数据类型及其独特特性,以帮助您针对每种特定情况选择正确的选项。
此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。
相关文章:
何时在 SQL 中使用 CHAR、VARCHAR 和 VARCHAR(MAX)
在管理数据库表时,考虑 CHAR、VARCHAR 和 VARCHAR(MAX) 是必不可少的。此外,使用正确的工具(例如dbForge Studio for SQL Server) ,与数据库相关的任务都会变得更加容易。它是针对 SQL Server 专业人员的强大的一体化解…...
学习笔记043——HashMap源码学习1
文章目录 1、HashMap2、Hashtable3、TreeMap4、HashMap 底层结构4.1、什么是红黑树? 1、HashMap HashMap key 是不能重复的,value 可以重复 底层结构 key-value 进行存储,key-value 存入到 Set 中,再将 Set 装载到 HashMap pack…...
单点登录原理
允许跨域–>单点登录。 例如https://www.jd.com/ 同一个浏览器下:通过登录页面产生的cookie里的一个随机字符串的标识,在其他子域名下访问共享cookie获取标识进行单点登录,如果没有该标识则返回登录页进行登录。 在hosts文件下面做的域名…...
【随笔】AI大模型对软件开发的影响
随着 AI 技术的不断发展,AI大模型正在重塑软件开发流程,从代码自动生成到智能测试,未来,AI 大模型将会对软件开发者、企业,以及整个产业链都产生深远的影响。欢迎探讨 AI 是如何重塑软件开发的各个环节以及带来的新的流…...
JAVA中接口类和抽象类的区别
在Java中,接口(Interface)和抽象类(Abstract Class)都是实现抽象概念的方式,但它们之间存在一些关键的区别: 1. 定义和声明 抽象类: 使用abstract关键字声明。可以包含构造方法、成…...
【AI系统】昇腾 AI 架构介绍
昇腾 AI 架构介绍 昇腾计算的基础软硬件是产业的核⼼,也是 AI 计算能⼒的来源。华为,作为昇腾计算产业⽣态的⼀员,是基础软硬件系统的核⼼贡献者。昇腾计算软硬件包括硬件系统、基础软件和应⽤使能等。 而本书介绍的 AI 系统整体架构&#…...
uniapp input只输入一个字符就自动失去焦点
下面一段代码在每次输入后自动失去焦点,这是因为绑定的:key是动态的,输入改变后都需要重新刷新渲染,这是造成input只能输入一次就自动失去焦点的原因。 <view class"" v-for"(item, index) in phoneList" :key"…...
定时/延时任务-ScheduledThreadPoolExecutor的使用
文章目录 1. 概要2. 固定速率和固定延时2.1 固定速率2.2 固定延时 3. API 解释3.1 schedule3.2 固定延时 - scheduleWithFixedDelay3.2 固定速率 - scheduleWithFixedDelay 4. 小结 1. 概要 前三篇文章的地址: 定时/延时任务-自己实现一个简单的定时器定时/延时任…...
自编码器(一)
其实自编码器也可以算是自监督学习的一环,因 此我们可以再简单回顾一下自监督学习的框架。如图1.1所示,首先你有大量的没有标注的 数据,用这些没有标注的数据,你可以去训练一个模型,你必须设计一些不需要标注数据的 任…...
Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway)
Spring Cloud(Kilburn 2022.0.2版本)系列教程(五) 服务网关(SpringCloud Gateway) 一、服务网关 1.1 什么是网关 在微服务架构中,服务网关是一个至关重要的组件。它作为系统的入口,负责接收客户端的请求,并将这些请求路由到相应的后端服务…...
40分钟学 Go 语言高并发:Go程序性能优化方法论
Go程序性能优化方法论 一、性能指标概述 指标类型关键指标重要程度优化目标CPU相关CPU使用率、线程数、上下文切换⭐⭐⭐⭐⭐降低CPU使用率,减少上下文切换内存相关内存使用量、GC频率、对象分配⭐⭐⭐⭐⭐减少内存分配,优化GC延迟指标响应时间、处理延…...
一文解析Kettle开源ETL工具!
ETL(Extract, Transform, Load)工具是用于数据抽取、转换和加载的软件工具,用于支持数据仓库和数据集成过程。Kettle作为传统的ETL工具备受用户推崇。本文就来详细说下Kettle。 一、Kettle是什么? Kettle 是一款开源的 ETL&#x…...
Tomcat新手成长之路:安装部署优化全解析(上)
文章目录 1.Tomcat简介2.Tomcat原理架构2.1.总体架构2.2.连接器2.2.1.具体功能2.2.2.IO模型2.2.3.逻辑处理流程2.2.4.内部处理流程 2.3.容器2.4.启动过程2.5.请求过程 3.Tomcat适用场景4.Tomcat与其他Web容器对比5.Tomcat安装和启动5.1.Java环境变量5.2.系统服务5.3.启动关闭 6…...
跟我学C++中级篇——通信的数据的传递形式
一、通信的数据传递 在开发程序中,无可避免的会进行数据的传递。这种传递方式有很多种,字节流、消息、Json、参数以及对象甚至可能的方法。那么在传递这些数据时,如何正确的采用更合适的方法,就成为了一个设计的首选的问题。 二…...
C语言 qsort及应用
qsort及应用 qsort:快速排序函数,需要引用stdlib.h文件. void qsort( void *base, size_t num, size_t width, int (__cdecl *compare )(const void *, const void *) ); 参数: base:需要排序的数组 num:数据个数(数组长度) width:每个数据的字节数(sizeof(数据类型)) compa…...
【C语言】连接陷阱探秘(4):检查外部类型
目录 一、外部类型概述 1.1. 外部类型的重要性 1.2. 外部类型在C语言中的使用 1.3. 注意事项 二、常见的外部类型陷阱 2.1. 结构体和联合体的大小不匹配 2.1.1. 示例代码 2.1.2. 正确的做法 2.2. 枚举类型的值不匹配 2.3. 函数签名不一致 2.3.1. 函数签名不一致的问…...
打造双层环形图:基础与高级渐变效果的应用
在数据可视化领域,环形图因其独特的展示方式而广受欢迎。今天,我们将通过ECharts库来创建一个具有双层渐变效果的高级环形图。本文将详细介绍如何实现这种视觉效果。 1. 环形图基础 首先,我们需要了解环形图的基本构成。环形图由内外两个圆…...
【Git】Git 完全指南:从入门到精通
Git 完全指南:从入门到精通 Git 是现代软件开发中最重要的版本控制工具之一,它帮助开发者高效地管理项目,支持分布式协作和版本控制。无论是个人项目还是团队开发,Git 都能提供强大的功能来跟踪、管理代码变更,并保障…...
【mac】mac自动定时开关机和其他常用命令,管理电源设置的工具pmset
一、操作步骤 1、打开终端 2、pmset 是用于管理电源设置的强大工具,我们将使用这个命令 (1)查询当前任务 pmset -g sched查看到我当前的设置是 唤醒电源开启在 工作日的每天早上8点半 上班时不用手动开机了 (2)删…...
【Leecode】Leecode刷题之路第62天之不同路径
题目出处 62-不同路径-题目出处 题目描述 个人解法 思路: todo代码示例:(Java) todo复杂度分析 todo官方解法 62-不同路径-官方解法 方法1:动态规划 思路: 代码示例:(Java&…...
基于深度学习的手势识别算法
基于深度学习的手势识别算法 概述算法原理核心逻辑效果演示使用方式参考文献 概述 本文基于论文 [Simple Baselines for Human Pose Estimation and Tracking[1]](ECCV 2018 Open Access Repository (thecvf.com)) 实现手部姿态估计。 手部姿态估计是从图像或视频帧集中找到手…...
helm部署golang服务
Helm 是 Kubernetes 的一个包管理工具,类似于 Linux 中的 apt 或 yum。它使得在 Kubernetes 上部署和管理应用程序变得更加简单和高效。 安装 https://get.helm.sh/helm-v3.16.3-linux-amd64.tar.gz具体版本号可以在github上看到最新的版本号,然后替换上面链接来获取。gith…...
DreamCamera2相机预览变形的处理
最近遇到一个问题,相机更换了摄像头后,发现人像角度顺时针旋转了90度,待人像角度正常后,发现 预览时图像有挤压变形,最终解决。在此记录 一人像角度的修改 先放示意图 设备预览人像角度如图1所示,顺时针旋…...
Mysql误删表中数据与误删表的恢复方法
查看数据库是否开启binlog日志 mysql> show variables like %log_bin%; ------------------------------------------------------------------------ | Variable_name | Value | ------------------------------------…...
lapack、blas、solver库的区别和联系
LAPACK、BLAS、Solver 库 是数值计算领域的重要组成部分,它们各自的功能和设计目标有所不同,但也存在密切的联系。 1. 概述 库主要功能设计目标BLAS提供基础的线性代数操作,如向量运算、矩阵-向量乘法、矩阵-矩阵乘法等。提供高度优化的基础线性代数操作,作为更高级库的底层…...
deepin 安装 chrome 浏览器
deepin 安装 chrome 浏览器 最近好多小伙伴儿和我说 deepin 无法安装最新的谷歌浏览器 其实是因为最新的 谷歌浏览器 其中的一个依赖需要提前安装 提前安装依赖然后再安装谷歌浏览器就可以了 安装 fonts-liberationsudo apt -y install fonts-liberation安装 chrome 浏览器sudo…...
永久免费的PDF万能水印删除工具
永久免费的PDF万能水印删除工具 1.简介 PDF万能水印删除工具,可以去除99.9%的PDF水印。例如:XObject水印(含图片水印)、文本水印、绘图水印/曲线水印、注释水印、工件水印、剪切路径水印等等。本软件是永久免费,无有…...
Linux网络——NAT/代理服务器
一.NAT技术 1.NAT IP转换 之前我们讨论了, IPv4 协议中, IP 地址数量不充足的问题,NAT 技术就是当前解决 IP 地址不够用的主要手段, 是路由器的一个重要功能。 NAT 能够将私有 IP 对外通信时转为全局 IP. 也就是一种将私有 IP 和全局IP 相互转化的技术方法: 很…...
大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO,VOC,COCO格式标注,4070张图片的数据集
大米中的虫子检测-检测储藏的大米中是否有虫子 支持YOLO,VOC,COCO格式标注,4070张图片的数据集 数据集分割 4070总图像数 训练组 87% 3551图片 有效集 9% 362图片 测试集 4% 157图片 预处理 自动定向…...
基于Java的小程序电商商城开源设计源码
近年来电商模式的发展越来越成熟,基于 Java 开发的小程序电商商城开源源码,为众多开发者和企业提供了构建个性化电商平台的有力工具。 基于Java的电子商城购物平台小程序的设计在手机上运行,可以实现管理员;首页、个人中心、用户…...
网站建设网页设计培训班/搜索引擎优化关键词的处理
欢迎关注”生信修炼手册”!mutagene是一个肿瘤突变频谱数据库,从ICGA, TCGA等肿瘤项目中收集整理蛋白编码基因上的体细胞突变数据,分析识别对应的突变频谱,对应的文章发表在Nucleic Acids Research,链接如下https://academic.oup.com/nar/art…...
wordpress付款插件/苏州网站seo服务
Linux文件系统结构 Linux目录结构的组织形式和Windows有很大的不同。首先Linux没有“盘(C盘、D盘、E盘)”的概念。已经建立文件系统的硬盘分区被挂载到某一个目录下,用户通过操作目录来实现磁盘读写。 Linux不像Windows那样的系统目录,Linux使用正斜杠&q…...
网站建设推广优化招聘模板/app开发工具哪个好
本文主要是为了检测你对SCRUM 评审会议的了解和使用程度, 通过本文你可以检测一下 1、你们的SCRUM 评审会议的过程和步骤 2、SCRUM 评审会议的输出结果一、会议目的 1. 团队的成果得到认可。他们会感觉很好。 2. 其他人可以了解你的团队在做些什么。 3. 演示…...
怎么通过ip查看自己做的网站/优化网站找哪家
近日,上海市科技创业中心予以公示“2020年度上海市高新技术成果转化项目百佳、自主创新十强”名单,上海控安自研的智能嵌入式单元测试用例设计工具软件(项目编号:202001003)成功从众多高新技术成果转化项目中脱颖而出&…...
wordpress上传文件类型/竞价被恶意点击怎么办
这段时间,经常用javascript获取各种form中的提交数据。考虑到代码的一致和逻辑的简化,建立如下两个js函数用统一的方式获取form中的数据.根据Formid 和 Inputid 获得数据 函数调用方式如下德例子. 获得数据: var CharStringgetValue(formid,CharString)…...
黄石做网站公司/网络营销的基本流程
1、两种实现activity跳转的方法 实现activity的跳转主要有两种方法,startActivity()和startActivityForResult();例如activity A跳转到activity B 对于,第一种,是把activity A的数据,通过intent传送到activity B,但是不…...