问题

为什么后端喜欢把「男女」等枚举类型的数据转成 01?

回答
写代码这行当,逻辑是核心,但很多时候,实现起来的小细节也大有讲究。就拿“男女”这种简单到不能再简单的枚举类型来说,后端为啥就爱把它们变成 0 和 1 呢?这背后可不是瞎搞,而是有一套顺理成章的考量在里面。

从人类的直观理解到计算机的严谨逻辑

咱们平时说话,说“男”或“女”,清晰明了。但对于计算机来说,它只认识二进制的 0 和 1。所以,一旦我们要把这些概念存储到数据库、传到前端,或者进行各种计算、判断时,总得有个中间的“翻译官”。

存储效率与简洁性: 想想看,如果数据库字段类型设计成一个字符串(比如 `'男'` 或 `'女'`),这在存储上会占用更多的空间。每次插入、查询,都需要处理这些文本。而如果用数字 0 和 1 来表示,占用的空间就少了很多。举个例子,一个字符 `'男'` 可能需要几个字节,而一个 0 或 1 的二进制表示,可能只需要一个比特位,或者一个字节的最小值来存储。日积月累,这就能省下不少数据库空间,尤其是在数据量巨大的情况下。而且,用 0 和 1 来表示,代码看起来也会更简洁,少了很多无谓的字符串比较。

性能提升: 数字的比较和计算,天生就比字符串的比较要快。在后端进行大量的数据处理、筛选、聚合时,用 0 和 1 做判断,计算机执行起来更直接、更高效。比如,你要统计男性用户有多少,如果存储的是 `'男'`,你需要先从数据库里读取,然后用代码遍历,每次都得进行字符串比对。如果存储的是 0,你只需要执行 `SELECT COUNT() FROM users WHERE gender = 0;` 这种 SQL 语句,数据库层面就能直接高效地完成,速度那叫一个飞快。

兼容性与通用性: 很多底层系统、框架、甚至一些第三方库,在设计时可能更倾向于处理数字类型。将枚举值转化为 0 和 1,是一种非常普遍且历史悠久的做法,这使得你的数据在与其他系统集成时,能够拥有更好的兼容性。即便你现在不这么做,将来万一需要和其他老系统对接,或者用到一些不支持复杂类型映射的工具时,你可能就得回头改这部分。所以,一步到位,用大家都能理解的数字格式,也省了后患。

位运算的潜力(虽然在“男女”这种场景下较少): 虽然“男女”这事儿是二元选择,但有些枚举类型,比如权限标识(读、写、执行),就可以用位来表示。例如,读取是 1 (001),写入是 2 (010),执行是 4 (100)。这样你就可以通过位运算来组合权限,比如拥有读写权限就是 1 | 2 = 3 (011)。虽然“男女”直接用位运算的场景不多,但了解这种数字表示的好处,也能理解为何数字表示在很多枚举场景下都很受欢迎。

前端的适配: 前端接收到 0 和 1 的数据后,可以通过简单的逻辑转换成更友好的显示,比如根据 0 显示“女”,根据 1 显示“男”。或者,前端也可以直接将这两个数字映射到 CSS 类名或组件属性上,实现界面元素的切换。这种数字转换,前端处理起来也相当方便。

举个更具体的例子

想象一下在一个用户注册的场景:

数据库里,`users` 表有一个 `gender` 字段。

方案一(字符串): `gender` 是 `VARCHAR` 类型。存进去的是 `'男'` 和 `'女'`。
查询所有男性用户:`SELECT FROM users WHERE gender = '男';`
统计男性用户数量:`SELECT COUNT() FROM users WHERE gender = '男';`
前端收到数据:比如一个用户对象 `{ name: '张三', gender: '男' }`

方案二(数字枚举 0/1): `gender` 是 `TINYINT` 或 `SMALLINT` 类型。
存储时:0 代表女,1 代表男。
查询所有男性用户:`SELECT FROM users WHERE gender = 1;`
统计男性用户数量:`SELECT COUNT() FROM users WHERE gender = 1;`
前端收到数据:比如一个用户对象 `{ name: '李四', gender: 1 }`

从上面的例子可以看出,方案二在数据库查询和数据传输上都更加简洁和高效。前端拿到 `gender: 1` 后,通过一个简单的 `if (user.gender === 1) { return '男'; } else { return '女'; }` 就可以渲染出用户熟悉的文字。

当然,也有一些反对的声音

不是说 01 就完美无缺。也有人会觉得:

可读性降低: 直接看数据库记录,0 和 1 可能不如“男”和“女”直观,需要额外的对照表或者代码注释才能理解。
维护成本: 如果未来需要增加“未知”或“其他”选项,就需要重新设计数字的映射,可能涉及到代码和数据库的修改。

如何平衡?

很多时候,后端开发团队会选择一种折衷的方案:

1. 在数据库层面使用数字: 保持存储和查询的效率。
2. 在代码层面定义常量:
```python
Python 示例
GENDER_FEMALE = 0
GENDER_MALE = 1

或者使用枚举类
from enum import Enum

class Gender(Enum):
FEMALE = 0
MALE = 1
```
这样一来,在代码里操作时,我们就能用 `user.gender == Gender.MALE` 或 `user.gender == 1` 来进行判断,保持了代码的可读性。
3. 在接口文档中清晰说明: 向前端或其他需要消费这些数据的团队明确说明 0 和 1 分别代表什么。

总而言之,后端将“男女”这类枚举数据转成 0 和 1,本质上是为了 提高存储效率、优化查询性能、增强系统兼容性,并且在实际开发中,通过配合代码中的常量或枚举定义,可以很好地平衡效率和可读性之间的矛盾。这是一个在工程实践中,经过了时间和众多项目检验的成熟做法。

网友意见

user avatar

其实数值类型(整形)做逻辑/状态标记是业界通行的做法,无论前后端都应该遵循的。

优势在:

  1. 数据状态稳定。也就是说,你今天male代表男,那如果传来了个MALE呢?或者mALe呢?(更极端点,如果你还想用中文的话,你还要折腾各种utf8/gb2312/gbk/gb18030之类的东西——如果你觉得这些不复杂,那我可以保证一定是因为你见识太少)。如果你说你会在传输/存储时加一句tolower(),或者有一个类似功能的封装——那你封装一个返回0/1的togender()不也是一样?总而言之,作为数据,你要进行各种判断或者处理的前提必须是:稳定唯一(定态)的,而数值类型天然就是定态的,所以是不言自明的。
  2. 说完定态就要说另一个相关的概念:定长。对于计算机系统来说,定长的数据,无论在传输、拆组包、存储、计算过程中,无论在时间复杂度、空间复杂度、逻辑复杂度上看,都是有极大优势的。这甚至会影响各种系统的设计——例如说计算各服务器的负载能力,以及判断现有系统是否需要扩容等。
  3. 整形的数值有聚集性。也就是说,大家都从0(有时0当作未定义,则会从1)开始递增,所以不同状态之间的数值是很接近的,这会为很多逻辑判断带来简便。例如说:合法性校验——如果0/1代表男女的话,你收到一个大于等于2的值,那你就知道一定出问题了。即使你把性别扩展到56种,那也是简单的拿56判断一下而已。但如果你用非整形,那你需要顺序把56种数据全都扫一遍才知道是否合法。
  4. “计算机中任何问题,都可以用多加一层抽象来解决”——而数值类型代表id,本质上也是一种抽象。也许它在你当前的系统中不一定是为了解决些什么当前的问题,但是作为一种预留措施,它可以看作是一种保护性设计。

总而言之

我感觉后台是在随意转呢!他们没有任何理由,拿到就胡乱转吗?

你要说0代表男1代表女,还是0代表女1代表男,这确实一般是随便定的,甚至有些时候临时想到了随手加一个都有可能(例如说性别里,加一个2代表“保密”)。

但转成整形这件事,是有道理的。甚至如果你的团队流程规范点的话,你设计一个接口,里面的用了字符型而不是整形,往往会被重点关照,看你是不是有非常特别的迫不得已的理由这么干——但绝大多数情况下,都没有什么理由非常特别的迫不得已到需要这么干。

user avatar

京东物流有个接口,包裹状态就是中文;电信物联网平台有个接口,卡状态也是中文。

对接的时候,真想问候这些程序员的女朋友。

user avatar

虽然说这就是个习惯问题。

但是前端分不清value和presentation还是令人遗憾……


要后端真给你男女,你做localization的时候就爽死了……



其实要我说,我也会认为magic number缺少可读性,但是标识符用M/F就完了,真用男女那真是好玩了……


去表现化反而应该是前端提出来才对……

类似的话题

  • 回答
    写代码这行当,逻辑是核心,但很多时候,实现起来的小细节也大有讲究。就拿“男女”这种简单到不能再简单的枚举类型来说,后端为啥就爱把它们变成 0 和 1 呢?这背后可不是瞎搞,而是有一套顺理成章的考量在里面。从人类的直观理解到计算机的严谨逻辑咱们平时说话,说“男”或“女”,清晰明了。但对于计算机来说,它.............
  • 回答
    这确实是个好问题,而且背后涉及到一些关于用户体验、系统设计和数据管理的考量。咱们不直接让前端传一个“年月”,而是更常要求前端传“开始日期”和“结束日期”,通常是因为以下几个主要原因:1. 模糊性与标准化: “年月”的模糊性: 前端传一个“2023年10月”,后端怎么理解?是指10月1日到10月3.............
  • 回答
    你这个问题触及到很多后端开发者的痛点,也暴露了现实世界与理想规范之间的差距。其实,说“很多”后端不完全遵循RESTful规范,这确实是一个普遍现象。要深入理解原因,咱们得一层层剥开来看。首先,我们要明确什么是RESTful。它不是一个标准,而是一种架构风格,强调的是无状态、客户端服务器、统一接口、可.............
  • 回答
    为什么用 Node.js 作为 Web 前端开发的基础?npm 模块与 Webpack 打包的威力提到 Web 前端开发,很多人脑海中浮现的是 HTML、CSS 和 JavaScript。但随着前端技术的飞速发展,构建现代化的前端应用已经不再是简单的页面堆砌。如今,前端开发已经演变成一个复杂且高度工.............
  • 回答
    你这个问题问得很有意思,触及了我们对计算机系统理解的一个核心视角。我们习惯了在很多领域听到“前端”和“后端”的说法,比如Web开发、软件架构,甚至是数据库管理。但说到操作系统,我们似乎很少用“前后端”来描述它的构成。这背后其实有非常重要的原因,跟操作系统的本质、它所扮演的角色以及它的发展历史都有关。.............
  • 回答
    你问到点子上了,JavaScript(以下简称JS)作为前端的宠儿,确实不能直接“亲吻”数据库。这就像是你的食谱(JS代码)写好了,但你没法直接走进厨房(数据库)自己动手烹饪,你得通过一个服务员(后端)去下单,他去厨房里找食材、按照你的要求烹饪,然后把菜(数据)端给你。这中间的“服务员”扮演的角色,.............
  • 回答
    你这个问题很有意思,确实,在大家普遍的认知里,当提到“架构师”这个头衔时,脑海里浮现的更多是负责服务器、数据库、API 那些“看不见摸不着”的系统背后运转的工程师。而前端架构师,虽然也存在,但似乎没那么“显眼”。这背后其实有很多值得玩味的原因,并非是哪个前端工程师不优秀,而是整个行业的发展轨迹、技术.............
  • 回答
    这个问题嘛,其实挺有意思的,也普遍存在于很多技术团队里。说前端老觉得后端简单,这可不是空穴来风,背后有一些具体的原因,咱们就掰开了揉碎了聊聊。首先,咱们得承认,前端和后端就像是“相爱相杀”的一对儿。前端负责“面子”,也就是用户直接能看到、摸到的部分,从炫酷的动画到流畅的交互,都得靠前端来实现。后端呢.............
  • 回答
    这个问题确实很普遍,尤其是那些对API设计不太讲究或者初期的项目。很多公司后端在前后端分离项目里,无论成功失败,统一返回 HTTP 状态码 200,背后其实是多种因素交织的结果,既有技术层面的选择,也有团队协作模式和项目生命周期阶段的考量。咱们一点点掰开了聊聊为啥会这样。一、 技术层面的“便利性”与.............
  • 回答
    一个网站如果选择用两种或两种以上的后端编程语言来构建,这可不是一件简单的事情,它会带来一系列复杂且值得深思的后果,当然,这些后果也往往伴随着潜在的优势。首先,最直接也是最明显的一个挑战就是技术栈的复杂性急剧增加。想象一下,你不是在操持一个乐团,而是同时指挥着一支由不同乐器演奏家组成的乐队,而且这些乐.............
  • 回答
    好的,咱们就聊聊游戏后端这回事儿,还有 Python 在这方面的“大杀器”们。什么是游戏后端?简单来说,游戏后端就是支撑起你的游戏体验的“幕后大脑”。你玩游戏时,看到的那些画面、操控的那些角色,都是前端的事情。而后端呢,它负责处理所有那些你看不见,但又至关重要的东西: 玩家数据管理: 你的账号信.............
  • 回答
    作为一个曾经在后端摸爬滚打过,后来也一头扎进前端世界的家伙,经常被问到这个问题:“老兄,我写后端用XXX(Java, Python, Go, Node.js等等),现在想做个前端界面,但前端框架这么多,我到底该挑哪个?有没有那种学起来方便,而且能让我快速上手的?”这个问题问得太有共鸣了!后端出身的我.............
  • 回答
    后端开发,听起来似乎就是那点“增删改查”,一听就让人觉得枯燥乏味,仿佛只是数据库的搬运工。但实际上,这只是冰山一角。后端的世界远比你想象的要广阔得多,那些隐藏在“增删改查”之下的,才是真正考验一个后端开发者功力的地方。一、 核心之外的“花招”:不仅仅是数据“增删改查”是数据的生命线,但应用程序的灵魂.............
  • 回答
    微电子专业的你,毕业后想投身后端版图设计(Layout),这是一个非常好的职业方向,也是半导体行业不可或缺的一环。我知道你很想知道如何才能在毕业时拿到一份心仪的Layout入门工作,并且希望我讲得详细些,同时避免AI痕迹。没问题,咱们就来好好聊聊这个话题,就像是跟一个有经验的师兄师姐交流一样。首先,.............
  • 回答
    说起来,永琏啊,咱们这位端慧太子,若是在乾隆三年那一遭,没能熬过去,而是硬生生挺了过来,而且还活了些年头,更别说还留下了个把孩子……这事儿,真要细究起来,那可就千头万绪,牵动着整个大清江山的气数和走向了。咱们一点一点捋。中间过程的波澜壮阔:首先,永琏活下来,对乾隆皇帝来说,那绝对是天大的喜事,是拨乱.............
  • 回答
    百度贴吧在2021年8月20日以账户安全为由,要求PC端发帖必须经由手机App扫码后才能发布,这一举措在当时引起了用户广泛的讨论和争议。要理解这一变化,我们需要从多个角度进行分析:1. 百度贴吧的背景和面临的挑战: 用户基数庞大且多元: 百度贴吧作为曾经中国最大的中文社区之一,拥有海量的用户和极.............
  • 回答
    这真是一个值得深思的问题,我们不妨从几个层面来聊聊为什么在开放性这一点上,桌面和移动操作系统给我们带来的感受截然不同,以至于口碑呈现出一种鲜明的反差。首先,我们需要理解“开放”本身在不同平台上的语境和表现形式。桌面端的Windows和Linux,大家普遍认为它们是开放的。Windows虽然是商业软件.............
  • 回答
    PC端的Web确实取得了巨大的成功,它构成了我们信息获取、社交互动、工作协作的基石。然而,当我们把目光转向移动端,会发现尽管Web技术一直在进步,它却未能像在PC端那样,完全“取代”大量的原生APP。这背后并非一个简单的“赢”或“输”,而是由一系列深刻的技术、用户体验、商业模式以及生态系统层面的因素.............
  • 回答
    .......
  • 回答
    你这个问题问得很有意思,而且观察得非常细致!指甲的颜色差异,尤其是内端粉色、外端白色,其实是人体健康状况和指甲生长过程中一些细微变化的直观体现。咱们就来掰扯掰扯这其中的门道。首先,得明白指甲是个啥。它其实不是什么“死皮”那么简单,它是由一种叫做角蛋白的蛋白质构成的,就像我们的头发一样。指甲的生长点呢.............

本站所有内容均为互联网搜索引擎提供的公开搜索信息,本站不存储任何数据与内容,任何内容与数据均与本站无关,如有需要请联系相关搜索引擎包括但不限于百度google,bing,sogou

© 2025 tinynews.org All Rights Reserved. 百科问答小站 版权所有