对于某些特殊字符,ISNUMERIC背后的逻辑是什么?
该ISNUMERIC函数具有某些意外行为。MSDN文档说: ISNUMERIC当输入表达式的计算结果为有效的数值数据类型时,返回1;否则返回0。有效的数字数据类型包括以下类型:int,bigint,smallint,tinyint,十进制,数字,money,smallmoney,float,real。 它也有一个脚注: ISNUMERIC对于非数字字符(例如加号(+),减号(-))和有效的货币符号(例如美元符号($)),返回1。有关货币符号的完整列表,请参见money和smallmoney(Transact-SQL)。 好的,因此+,-和列出的货币符号应被视为数字。到目前为止,一切都很好。 现在是奇怪的部分。首先,链接文章中的某些货币符号不是数字,包括: 欧元货币符号,十六进制20A0: ₠ 奈拉符号,十六进制20A6: ₦ 里亚尔符号,十六进制FDFC: ﷼ 这很奇怪,我似乎找不到原因?此版本或环境相关吗? 但是,事情变得奇怪了。这里有一些我无法解释的内容: /不是数字,而是\(呵呵!) REPLICATE(N'9', 308)是数字,但REPLICATE(N'9', 309)不是 第一个也是最基本的问题是:什么能解释上述情况?但更重要的是:背后的逻辑是什么ISNUMERIC,以便我自己解释/预测所有情况? 这是重现事物的好方法: DECLARE @tbl TABLE(txt NVARCHAR(1000)); INSERT INTO @tbl (txt) VALUES (N''), (N' '), (N'€'), (N'$'), (N'$$'), (NCHAR(8356)), (NCHAR(8352)), (NCHAR(8358)), (NCHAR(65020)), (N'+'), (N'-'), (N'/'), (N'\'), (N'_'), (N'e'), (N'1e'), (N'e1'), (N'1e1'), (N'1'), (N'-1'), …