惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

A
About on SuperTechFans
Y
Y Combinator Blog
钛媒体:引领未来商业与生活新知
钛媒体:引领未来商业与生活新知
Microsoft Security Blog
Microsoft Security Blog
aimingoo的专栏
aimingoo的专栏
I
InfoQ
C
Check Point Blog
IT之家
IT之家
MyScale Blog
MyScale Blog
Apple Machine Learning Research
Apple Machine Learning Research
Vercel News
Vercel News
Last Week in AI
Last Week in AI
GbyAI
GbyAI
P
Proofpoint News Feed
量子位
Stack Overflow Blog
Stack Overflow Blog
Microsoft Azure Blog
Microsoft Azure Blog
月光博客
月光博客
阮一峰的网络日志
阮一峰的网络日志
人人都是产品经理
人人都是产品经理
B
Blog
T
The Blog of Author Tim Ferriss
H
Help Net Security
云风的 BLOG
云风的 BLOG

博客园 - AlfredZhao

Git 提交代码:从报错到 SSH 免密推送 GitHub 克隆他人私有仓库:从授权到下载 理解Oracle Property Graph:以账户转账示例完成图特性最小测试 APEX 无法分配 SH 用户?一个存储过程轻松解决 SH 中文化样例数据使用手册 Oracle 排除非业务表:一份能直接抄的“全量过滤”SQL 进程都杀了,为什么 `netstat` 还能看到端口? MAC 空间告急?Codex 的 156GB 缓存垃圾,这样清! 人工清理问题数据:先查准,再删除 TK(Trusted Knowledge)为何而生? 使用快捷键快速切换 Mac 外接显示器模式 客户环境 Nginx 配置:流式报表与超时排查要点 Security Central:数据库安全的统一控制与运营平台 Palantir 眼中的一次“订单可能延期”,如何成为实时决策的起点? 从一条订单消息到 Bronze、Silver、Gold:我的第一次 Kafka + Lakehouse 实验 UUID v4 与 v7:同样是唯一 ID,为什么数据库表现可能完全不同? 用 crontab 给 LLM 使用量装上“监控眼” DeepSeek 与 GPT API 价格调整:该关注什么? 查看 Oracle 数据库中的定时任务执行情况 Codex 专用用户登录后自动进入默认项目目录 Mac 小技巧:用方向键优雅处理超长网址 Oracle GDD 与 Raft:别把共识机制和数据主权混为一谈 在 Oracle APEX 中用 BGE_BASE 生成向量:从模型导入到历史数据更新 行业人+AI:真正有价值的四个关键要素 知识库文件解析失败:一次由 Domain Index 引发的定位记录 Skill 的使用:从路径到能力边界 切换 Embedding 模型时,千万别忽略历史向量维度 kbot 适配 GPT-5.6:一次参数兼容性排查 Git 打 Tag 上传 GitHub 遇到 SSH 超时,如何处理? SQL JOIN 写法:把多表关联条件写清楚
Unicode 码位数、UTF-8 字节数、中英文差异和 Oracle 长度别...
AlfredZhao · 2026-08-21 · via 博客园 - AlfredZhao

2026-08-21 06:37  AlfredZhao  阅读(2)  评论()    收藏  举报

处理文本长度时,很多人最常见的困惑就是:听说中文要占 3 个字节?那英文单词怎么算的?Oracle 的 VARCHAR2 好像给的挺大,但貌似还没存那么多就报错长度不够存了?

其实,关键就在于要先区分清楚三种不同的“长度”代表的含义。

01 | Unicode 码位数

三种长度,含义有所不同,其中 Unicode 码位数最好理解,直接是按字符逐个计数的方式。

对常见的中文、ASCII 英文字母、空格、换行、标点和单个 而言,通常各算 1 个 Unicode 码位。不像 UTF-8 字节数还需要稍微换算下。

笔者注:“肉眼看到的一个字符”不一定只包含一个码位,例如组合字符和部分 emoji 序列。

内容 Unicode 码位数 UTF-8 字节数
1 3
A 1 1
hello 5 5
你好 2 6
1 4

因此,英文“单词”没有固定长度,要看里面实际包含多少字符:

  • hello = 5
  • don't = 5
  • e-mail = 6
  • AI2026 = 6

02 | UTF-8 字节数为何不同

UTF-8 是一种编码方式,它决定字符存储时占多少字节。常见情况下,ASCII 英文字符占 1 字节,中文通常占 3 字节, 通常占 4 字节。

所以“一个中文占 3 个”说的通常是 UTF-8 字节数,并不是 Unicode 码位数。你好 有 2 个码位,但存成 UTF-8 通常需要 6 字节。

03 | Oracle VARCHAR2 要看 CHAR 还是 BYTE

Oracle 的长度规则还取决于列定义和数据库字符集。数据库字符集为 AL32UTF8 时,中文通常占 3 字节,但以下两种定义含义不同:

  • VARCHAR2(6000 CHAR):最多 6,000 个字符
  • VARCHAR2(6000 BYTE):最多 6,000 个字节

前者关注字符数量,后者关注存储字节数,不能混为一谈,如果创建字段类型时,如果未显式指定 CHAR 或 BYTE,很多环境默认是 BYTE,但不要依赖默认值,建表时应明确写出语义,这也是很多人会踩坑的地方。
此外,VARCHAR2(6000 CHAR) 表示最多 6,000 个字符语义上的字符;但它仍受 VARCHAR2 的绝对字节上限限制。MAX_STRING_SIZE = STANDARD 时上限为 4000 字节,EXTENDED 时为 32767 字节。因此在 AL32UTF8 中,想稳定容纳 6000 个中文,通常需要 MAX_STRING_SIZE = EXTENDED;否则应使用 CLOB。

一个很实用的 Oracle 自检 SQL:

SELECT LENGTH(col)  AS char_count,
       LENGTHB(col) AS byte_count
FROM   your_table;

04 | 应用层截断又是另一件事

Python 中的 text[:6000] 按 Unicode 码位截取:6,000 个中文大致可达到 18,000 个 UTF-8 字节;6,000 个 ASCII 英文字符约为 6,000 字节;中英文混合则介于两者之间。

因此,这类 6,000 限制是应用层控制传给模型内容规模的规则,不等同于 Oracle VARCHAR2 限制,也不是 UTF-8 字节限制。

关注我,和AI一起成长~