如何将波斯数字转换为整数?SQL触发器适配波斯数字输入问题
解决波斯数字在SQL Server触发器数值校验中的问题
我完全懂你的困扰——SQL Server自带的ISNUMERIC()函数对波斯(阿拉伯-波斯)数字的支持很差,像۴۵这种合法的数值输入,会被它误判为非数值,导致触发器直接回滚了正常操作。下面是具体的解决方案:
核心问题分析
ISNUMERIC()函数只认拉丁体系的阿拉伯数字(0-9),对于波斯数字(۰-۹)这类Unicode字符,它会直接返回0,所以你的触发器才会错误拦截合法输入。
解决方案步骤
1. 编写波斯数字转阿拉伯数字的自定义函数
首先我们需要一个工具函数,把输入里的波斯数字字符逐个替换成对应的拉丁阿拉伯数字:
CREATE FUNCTION dbo.ConvertPersianToArabicDigits(@Input NVARCHAR(100)) RETURNS NVARCHAR(100) AS BEGIN DECLARE @Output NVARCHAR(100) = @Input -- 逐个替换波斯数字为阿拉伯数字 SET @Output = REPLACE(@Output, N'۰', N'0') SET @Output = REPLACE(@Output, N'۱', N'1') SET @Output = REPLACE(@Output, N'۲', N'2') SET @Output = REPLACE(@Output, N'۳', N'3') SET @Output = REPLACE(@Output, N'۴', N'4') SET @Output = REPLACE(@Output, N'۵', N'5') SET @Output = REPLACE(@Output, N'۶', N'6') SET @Output = REPLACE(@Output, N'۷', N'7') SET @Output = REPLACE(@Output, N'۸', N'8') SET @Output = REPLACE(@Output, N'۹', N'9') RETURN @Output END
注意:必须用
NVARCHAR类型,且给字符加N前缀,确保SQL Server能正确识别Unicode编码的波斯数字。
2. 修改触发器,基于转换后的值做校验
我建议用TRY_CONVERT()替代ISNUMERIC()——因为ISNUMERIC()会把一些奇怪的字符(比如$、+)误判为数值,而TRY_CONVERT()只有在真正能转换为指定数值类型时才返回结果,否则返回NULL,准确性高得多。
修改后的触发器代码:
CREATE TRIGGER trg_ValidateNumericValue -- 替换成你的触发器名称 ON YourTableName -- 替换成你的表名 AFTER INSERT AS BEGIN SET NOCOUNT ON; -- 先转换波斯数字,再校验是否为有效数值 IF EXISTS ( SELECT * FROM inserted i WHERE TRY_CONVERT(NUMERIC(18, 0), dbo.ConvertPersianToArabicDigits(i.value)) IS NULL ) BEGIN ROLLBACK TRANSACTION; RAISERROR('When productType is numeric, you must insert valid numeric characters (Persian digits are allowed)', 18, 1); RETURN; END END
额外补充
- 如果你的业务需要存储阿拉伯数字而非波斯数字,可以在触发器里直接转换后更新记录,或者在插入前由应用层处理;如果只是做校验,上面的方案就足够了。
TRY_CONVERT()支持SQL Server 2012及以上版本,如果你的版本更低,可以考虑转换后用ISNUMERIC(),但还是推荐尽量升级到支持TRY_CONVERT的版本,避开ISNUMERIC的各种坑。
内容的提问来源于stack exchange,提问作者Amirali Sam
相关产品推荐
相关产品推荐

