如何在MySQL中存储波斯数字?INT列输入波斯数字报错求助
解决MySQL INT列无法存储波斯数字的问题
首先得明确一个核心问题:INT是数值类型,它只接受标准阿拉伯数字(0-9)作为有效输入。你输入的波斯数字“۱、۲、۳”本质是Unicode字符(对应U+06F1至U+06F9),属于字符串范畴,直接插入INT列必然触发类型转换错误——这和数据库编码、排序规则完全无关,之前执行的SET NAMES UTF8、mysqli_set_charset这些操作都是用来解决字符存储乱码的,对这个类型不匹配的问题起不到作用。
下面给你两种可行的解决方案:
方案一:插入前将波斯数字转换为阿拉伯数字(推荐)
在PHP层做转换,把波斯数字替换成对应的阿拉伯数字,再插入INT列。这里给你写个简单的转换函数:
function persianToArabicNumbers($input) { // 映射波斯数字到阿拉伯数字 $persianDigits = ['۰', '۱', '۲', '۳', '۴', '۵', '۶', '۷', '۸', '۹']; $arabicDigits = ['0', '1', '2', '3', '4', '5', '6', '7', '8', '9']; return str_replace($persianDigits, $arabicDigits, $input); } // 使用示例 $persianPrice = '۱۲۳۰۰۰'; // 用户输入的波斯数字价格 $validPrice = persianToArabicNumbers($persianPrice); // 转换为"123000" // 之后执行插入操作,把$validPrice存入INT列
这种方式既能保留INT类型的所有优势(比如数值计算、排序、范围查询),又能兼容用户输入的波斯数字。
方案二:修改列类型为字符串类型(不推荐,仅特殊场景使用)
如果你的业务完全不需要对Price列做数值操作(比如计算总价、排序价格区间),可以把Price列的类型改成VARCHAR(20)或者TEXT,这样就能直接存储波斯数字字符串。但这种方式会失去数值类型的便利性,后续如果需要做数值相关操作会非常麻烦,所以只建议在极端场景下使用。
内容的提问来源于stack exchange,提问作者Navid
相关产品推荐
相关产品推荐

