别再踩坑了!SQL Server数据类型那点事儿,看懂这篇少背三个锅

大家好,我是刚子。

一个写了六年代码、踩过无数数据库坑的.NET程序员。今天不整那些虚的,就想跟你唠唠SQL Server里那些让人头大的数据类型。

说实话,我刚入行那会儿,看见varchar和nvarchar也是一脸懵,心想"能存进去不就行了?"结果线上出过乱码,表空间爆过,甚至还因为float存钱对不上账,被财务小姐姐追着骂了一下午......

所以今天这几个坑,我是真心想跟你聊聊。文章不长,但保证看完能少走弯路。

1. char(3) 和 varchar(3):铁盒子 vs 塑料袋

这俩的区别,你就想成装东西的容器。

char(3) 像个铁盒子,大小固定。你往里放"AB",它也要占满3个位置,后面给你补个空格。放"ABC",刚好塞满。不管放多放少,它都占3个位置。

varchar(3) 像个塑料袋,最大能装3个,但你只放"AB"的时候,它就缩成2个的大小,绝不浪费。

所以怎么选?

存那种长度基本固定的(比如性别、手机号区号),用char,读取快一丢丢。

存那种长短不一的(比如地址、昵称、备注),用varchar,省空间,别跟磁盘过不去。

2. varchar(20) 和 nvarchar(20):英文袋 vs 国际袋

这组最坑人,也是我当年被骂得最惨的一次。

varchar 是"英文专用袋"。一个英文字母占1个格子,所以varchar(20)能装20个字母。但中文呢?一个字要占2个格子,所以只能装10个汉字。更难受的是,如果你没设置好编码,汉字直接变乱码,你都不知道用户当初写的啥。

nvarchar 是"国际通用袋"。不管英文、中文、日文,每个字符都占2个格子,统一对待。nvarchar(20)就是铁了心能装20个字符,无论什么语言。

所以怎么选?

如果你的系统百分百确定只存英文数字(比如老外的纯英文软件),用varchar省点空间。

但凡有一丝丝可能存中文、表情、多语言,直接上nvarchar,别犹豫。咱们写.NET的,C#里的string就是Unicode,对应到SQL Server就是nvarchar,用这个最省心。

3. float 和 decimal:马大哈 vs 会计

这组没啥好纠结的,一句话说透:

float 是个"马大哈"。科学计算挺在行,但它存的是近似值。你让它算0.1+0.2,它敢给你算出0.30000000000000004。你要拿它存钱,月底对账的时候财务能把你吃了。

decimal 是"会计"。每一分钱都给你算得清清楚楚,精确到你指定的小数位数。比如decimal(18,2),总共有18位数字,小数点后面保留2位,绝不会多出一分钱的零头。

所以怎么选?

做物理、地理、图表那种"差不多就行"的计算,用float没问题。

只要是钱、单价、库存、任何跟账目相关的,打死也得用decimal。这是原则问题,别问我怎么知道的。

4. 顺便说一句 default 是啥

有人问我"float和default有啥区别",这俩根本不是一码事。

float是数据类型,default是默认值约束。比如你建表时加一列CreateTime datetime default getdate(),意思就是"如果你不填,我就自动给你填上当前时间"。它不跟任何数据类型PK,只是帮你偷个懒而已。

给.NET兄弟的一张对照表

最后,作为.NET程序员,我习惯把SQL Server类型和C#类型对应起来,这样用EF或者手写SQL时心里有数:

|---------------|--------------|-------------------|
| SQL Server | C# (EF Core) | 场景 |
| char(n) | string | 固定长度代码,极少用 |
| varchar(n) | string | 纯英文/数字,节省空间 |
| nvarchar(n) | string | 强烈推荐,兼容中文,对应C#字符串 |
| decimal(18,2) | decimal | 金额、精确计算,必须用这个 |
| float | double | 科学计算、非货币的高精度计算 |

写在最后

好了,今天就聊到这儿。这些都是我这些年踩坑踩出来的经验,希望能帮你少走弯路。

如果你觉得文章有用,点个赞、转给身边的兄弟,说不定哪天他就能少背一个锅。

我是刚子,一个还在写代码的.NET老程序员。咱们下回见!

相关推荐
AskHarries10 小时前
一个页面如何布局关键词
程序员
面包龙11 小时前
什么是 AI?从人工智能、机器学习到大语言模型和 Agent
人工智能·程序员·全栈
明月沟渠照不进11 小时前
我让 TRAE Work 给自己造了个"填表技能",工时日报从此只说一句人话
程序员
文心快码BaiduComate11 小时前
额度不足的痛,我们懂!文心快码Comate测试版不限量Token第二弹来了!
程序员·ai编程·创业
神奇小汤圆12 小时前
爽用 DeepSeek V4 Flash、GLM-5.2、Qwen3.8 Max、GPT 5.6 Luna,OpenCode 太香了!
程序员
程序员cxuan14 小时前
DeepSeek Harness 必装的插件公布了!
人工智能·后端·程序员
刚子编程14 小时前
CSS样式加载失败排查完全指南:从控制台到响应头的完整思路
content-type·浏览器缓存·码农刚子·css样式排查·mime类型·iis配置
卡卡罗特学AI15 小时前
Codex 百万上下文终于能开了,只要改这 3 行配置
程序员
SamDeepThinking16 小时前
从REST到gRPC,一个API选型的思考框架
java·后端·程序员
无责任此方_修行中16 小时前
AI 成本复盘!5 个月后的真实使用情况(附账单)
后端·程序员·ai编程