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

推荐订阅源

OSCHINA 社区最新新闻
OSCHINA 社区最新新闻
博客园 - 聂微东
博客园 - 叶小钗
爱范儿
爱范儿
罗磊的独立博客
Hugging Face - Blog
Hugging Face - Blog
阮一峰的网络日志
阮一峰的网络日志
S
SegmentFault 最新的问题
Apple Machine Learning Research
Apple Machine Learning Research
美团技术团队
T
Tailwind CSS Blog
博客园 - 司徒正美
让小产品的独立变现更简单 - ezindie.com
让小产品的独立变现更简单 - ezindie.com
宝玉的分享
宝玉的分享
量子位
奇客Solidot–传递最新科技情报
奇客Solidot–传递最新科技情报
The Cloudflare Blog
人人都是产品经理
人人都是产品经理
小众软件
小众软件
博客园 - 【当耐特】
博客园 - 三生石上(FineUI控件)
V
Visual Studio Blog
雷峰网
雷峰网
酷 壳 – CoolShell
酷 壳 – CoolShell

博客园 - 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一起成长~