MySQL无内置汉字数字转阿拉伯数字函数,需自定义存储函数,通过CASE映射单字、遍历解析、处理权位进位及“万”“亿”分节逻辑实现准确转换。

MySQL函数不支持直接处理汉字数字,必须手动映射
MySQL原生没有汉字数字转阿拉伯数字的内置函数,CONVERT、CAST或字符集转换都无效。你得自己写一个存储函数,把“零一二三四……十百千万亿”逐字匹配并计算。这不是字符串替换,而是带进位规则的数值解析——比如“十二”不是'十'+'二'简单相加,而是10+2;“一百零五”要识别“零”跳过但保留后续位权。
用CREATE FUNCTION定义可复用的转换逻辑
函数需接收VARCHAR输入,返回BIGINT(覆盖“万亿”级),内部用DECLARE变量存当前值、权位(个、十、百…)、临时积。关键步骤:
- 预定义汉字到数字的映射表:用
CASE语句处理单字,如WHEN '零' THEN 0,WHEN '十' THEN 10,WHEN '百' THEN 100等 - 从左到右遍历字符串,用
SUBSTRING逐字取值,区分“数字符号”(零一二…九)和“权位符号”(十百千万亿) - 遇到“十”且前面无数字时,默认补1(如“十五”的“十”实际是10,不是0×10)
- “万”“亿”是分节符:遇到“万”,把当前累计值×10000后清零再继续;“亿”同理×100000000
示例核心片段:
SET i = 1;
WHILE i <= LENGTH(input_str) DO
SET c = SUBSTRING(input_str, i, 1);
CASE c
WHEN '零' THEN SET digit = 0;
WHEN '一' THEN SET digit = 1;
...
WHEN '十' THEN SET unit = 10;
WHEN '百' THEN SET unit = 100;
WHEN '千' THEN SET unit = 1000;
WHEN '万' THEN SET result = result + curr * 10000; SET curr = 0;
...
END CASE;
-- 后续累加逻辑略
SET i = i + 1;
END WHILE;
常见错误:忽略“十”的隐含系数和“零”的占位逻辑
最常出错的是这两类:
面向 CRM 系统的 MySQL 8 数据库模式设计。当用户需要为客户关系管理(CRM)系统设计、评审、优化或生成数据库模式时,应使用此项技能。
- 把“二十”当成
2+10(得12),实际应是2×10;更糟的是“十二”被算成10+2(正确)但“一十”被误判为10而非10——MySQL里“一十”极少用,但函数得兼容 - “一百零五”中“零”不是跳过就完事,它表示“百位后缺十位”,所以“零五”要变成5加到个位,而不是丢弃“五”。没处理这点会导致“一百零五”变“一百五”(105→150)
- “两”未支持:口语常用“两百”而非“二百”,需在
CASE里额外加WHEN '两' THEN 2 - 空格或全角字符导致
SUBSTRING取错字:建议开头用REPLACE(REPLACE(input_str, ' ', ''), ' ', '')清洗
性能与边界提醒:别在大表SELECT中直接调用
这个函数是纯循环+条件判断,每字符至少一次CASE和一次SUBSTRING,O(n)但常数较大。在WHERE或ORDER BY里调用会阻止索引使用,百万行以上查询可能秒变分钟级。真正要用,优先考虑:
- 业务层转换后再入库(比如App收到“三万二千”就存32000)
- 若必须数据库内算,先用
ALTER TABLE ADD COLUMN arabic_num BIGINT,再UPDATE ... SET arabic_num = zh_to_arabic(chinese_col)批量固化 - 函数不处理“兆”“京”等古单位,也不校验非法输入(如“一十一”),遇到就返回
NULL或报错,得靠上游保证格式
写完记得用SELECT zh_to_arabic('三千零八') AS n;验证,结果应为3008。别忘了DELIMITER切换,否则CREATE FUNCTION会因分号提前结束。

















