mysql怎么用函数实现多字节字符的截取_使用SUBSTRING与CHARACTER_LENGTH
MySQL 中 SUBSTRING 截取中文乱码?本质是字节 vs 字符混淆
核心问题在于:SUBSTRING 函数默认按字节进行截取。在 utf8mb4 编码下,一个中文字符通常占用 3 到 4 个字节。若错误地使用返回字节数的 LENGTH() 函数来配合 SUBSTRING 操作,极易截取到半个汉字,从而产生乱码。正确的解决方案是使用 CHARACTER_LENGTH() 函数,它返回的是我们直观可见的字符数,能确保精准定位到“第几个字”。

SUBSTRING(str, pos, len) 的 pos 和 len 都按字符位置算
需要明确一个关键点:SUBSTRING 函数本身不区分编码,其参数 pos(起始位置)和 len(长度)在定义上就是基于“字符数”计算的。但前提是,你传递给它的数值必须是字符数,而非字节数。
- 典型的错误写法:
SUBSTRING(name, LENGTH(LEFT(name, 2)), 1)。此代码试图先用LEFT取前2个字节,再用LENGTH()计算其字节长度作为起始位。风险在于,LEFT(name, 2)取出的2个字节可能只是一个汉字的一部分,导致后续计算完全偏离预期。 - 正确的做法:直接使用字符数。例如,
SUBSTRING(name, 1, 2)就是截取前2个字符,简单直接。若需动态计算,例如截取最后2个字符,可写作:SUBSTRING(name, CHARACTER_LENGTH(name) - 2 + 1, 2)。 - 额外注意:在
utf8mb4的排序规则(如utf8mb4_0900_as_cs)下,SUBSTRING的行为是稳定可靠的。但如果使用的是旧版的utf8(实为 utf8mb3),处理四字节的 Emoji 表情时仍可能出错。
CHARACTER_LENGTH() 不是万能补丁,得看字段实际编码
使用 CHARACTER_LENGTH() 就能一劳永逸吗?并非如此。该函数返回的是 Unicode 字符的个数,但其准确性依赖于字段本身声明的字符集。设想一个场景:一个字段被定义为 latin1 字符集,但实际存储的却是 UTF-8 编码的中文。此时,CHARACTER_LENGTH() 可能会将一个汉字错误地计为3个字符。这并非函数缺陷,而是数据存储层出现了编码不匹配。
- 第一步,检查字段的真实字符集:执行
SHOW FULL COLUMNS FROM table_name LIKE 'column_name';,重点关注Collation列,确保其指向utf8mb4_*系列的排序规则。 - 临时转换的权宜之计:若暂时无法修改表结构,可在查询时进行编码转换:
SUBSTRING(CONVERT(column_name USING utf8mb4), 1, 5)。但此方法存在性能开销,不建议在数据量大的表或 WHERE 条件中频繁使用。 - 更简洁的替代方案:对于简单的截取操作,
LEFT(column_name, 5)与SUBSTRING(column_name, 1, 5)效果完全相同,前者书写更简洁。RIGHT()函数同理。
遇到 SUBSTRING 返回空或问号?先查连接层编码
有时,即使 SQL 语句逻辑无误,执行结果仍可能出现乱码、空字符串或问号。这通常源于数据库连接层的编码问题。如果客户端连接使用的是 latin1 编码,或未正确设置 SET NAMES utf8mb4,那么 SUBSTRING 函数接收到的可能已是一个被损坏的字符串,后续任何字符数计算都将失效。
- 连接时指定编码:在命令行连接时,可添加参数:
mysql --default-character-set=utf8mb4 -u user -p。 - 执行前校验编码设置:运行查询
SELECT @@character_set_client, @@character_set_connection, @@character_set_results;,确保这三个系统变量的值均为utf8mb4。 - 一个常见的错误现象:执行
SUBSTRING('你好世界', 1, 2)却返回空值或乱码。这大概率是客户端解码失败所致,而非函数本身功能失效。
归根结底,真正的挑战往往不在于函数语法本身,而在于确保字符集声明、连接参数与实际字段存储三者之间的一致性。只要其中任何一层未能对齐,缺少了关键的 mb4 支持,那么之前所有基于 CHARACTER_LENGTH() 的精心计算都可能前功尽弃。
相关攻略
零知识证明技术对决:zk-SNARKs与zk-STARKs的全面解析 在区块链技术向更高阶的隐私保护与可扩展性演进的过程中,零知识证明已成为不可或缺的核心密码学组件。其中,zk-SNARKs与zk-STARKs作为两大主流技术路径,其间的差异与选择深刻影响着DeFi、NFT、Layer2扩容乃至元宇
字节跳动火山引擎官网最近更新了其视频生成模型 Doubao-Seedance-2 0 的 API 定价细节,引发了行业关注。根据公布的信息,该模型的调用费用根据输入模态有所不同:支持视频输入(例如视频编辑任务)的版本定价为每百万 tokens 28 元;而不含视频输入(即纯视频生成)的版本,价格则为
智东西作者 杨京丽编辑 李水青 上周,AI视频生成领域权威的盲测平台Artificial Analysis榜单发生重大变动。一个名为“HappyHorse”(快乐小马)的匿名模型异军突起,在文生视频和图生视频两个赛道的无音频类别中同时登顶,超越了此前长期领先的字节跳动Seedance 2 0,成为新
利用Go标准库encoding binary,可将int64安全转换为字节数组。核心原理是int64与uint64底层二进制补码相同,通过uint64类型转换后,使用binary PutUint64写入字节切片。转换需注意字节序一致性,并确保切片长度为8。反向还原时,需先用Uint64读取再转为int64。此方法高效无损,适用于底层二进制处理。
使用std::span解析字节报文时,需确保底层缓冲区生命周期长于所有span实例,避免悬垂访问。构造时应使用实际接收字节数,而非缓冲区容量,防止越界。进行subspan切片前须手动校验边界,避免静默截断或未定义行为。访问关键字段建议启用at()进行边界检查或手动校验,提取结构体字段应优先使用安全方法。
热门专题
热门推荐
AIAgent竞争焦点转向“谁能干”,OpenAI、Anthropic与Google正围绕桌面智能展开较量。GPT-5 4在桌面操控任务上超越人类基准且成本较低,Claude在复杂编码与可靠性上保持优势,而Gemini的多模态能力扎实但整体进度滞后。开发者需根据场景在性能、成本与生态间权衡选择。
拼多多2025年第一季度营收1062亿元,增长稳健。联席CEO陈磊表示,跨境电商“新拼姆”迎来新起点,是供应链升级关键期。相比国内成熟市场,海外品牌建设尚处早期,自营品牌潜力巨大。未来将加大投入,深耕国内供应链,旨在孵化国际影响力品牌,推动供应链整体价值跃迁,使国际业务成为增长与供应链进阶。
墨西哥市民近日拍到碟形不明飞行物在空中缓慢旋转晃动,特征与全球多地历史目击描述相似。巧合的是,美国近期正分批解密超过222份不明空中现象档案,官方承认许多案例无法解释,但尚未发现与外星生命相关的证据。





