ISNUMERIC
기능은 일부 예기치 않은 동작이 있습니다. MSDN 설명서는 다음과 같이 말합니다.
ISNUMERIC
입력 표현식이 유효한 숫자 데이터 유형으로 평가되면 1을 리턴합니다. 유효한 숫자 데이터 유형에는 int, bigint, smallint, tinyint, decimal, numeric, money, smallmoney, float, real이 있습니다.
또한 각주도 있습니다.
ISNUMERIC
더하기 (+), 빼기 (-)와 같이 숫자가 아닌 일부 문자 및 달러 기호 ($)와 같은 유효한 통화 기호에 대해서는 1을 반환합니다. 통화 기호의 전체 목록은 money 및 smallmoney (Transact-SQL)를 참조하십시오 .
따라서 +
, -
및 표시된 통화 기호는 숫자로 간주됩니다. 여태까지는 그런대로 잘됐다.
이제 이상한 부분입니다. 먼저 링크 된 기사의 일부 통화 기호는 다음을 포함하여 숫자 가 아닙니다 .
- 유로 통화 기호, 16 진수 20A0 :
₠
- 나이라 부호, 16 진수 20A6 :
₦
- 리얼 사인, 16 진수 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'), (N'+1'), (N'1+1'), (N'⒈'), (N'🄂'), (N'¹'), (N'①'), (N'½'),
(N'🎅'), (REPLICATE(N'9', 307)), (REPLICATE(N'9', 308)), (REPLICATE(N'9', 309)),
(REPLICATE(N'9', 310));
SELECT UNICODE(LEFT(txt, 1)) AS FirstCharAsInt,
LEN(txt) AS TxtLength,
txt AS Txt,
ISNUMERIC(txt) AS [ISNUMERIC]
FROM @tbl;
로컬 Sql Server 2012 상자에서 이것을 실행하면 다음과 같은 결과가 나타납니다.
FirstCharAsInt TxtLength Txt ISNUMERIC
--------------- ---------- --------- ----------
NULL 0 0
32 0 0
8364 1 € 1
36 1 $ 1
36 2 $$ 0
8356 1 ₤ 1
8352 1 ₠ 0 --??
8358 1 ₦ 0 --??
65020 1 ﷼ 0 --??
43 1 + 1
45 1 - 1
47 1 / 0
92 1 \ 1 --??
95 1 _ 0
101 1 e 0
49 2 1e 0
101 2 e1 0
49 3 1e1 1
49 1 1 1
45 2 -1 1
43 2 +1 1
49 3 1+1 0
9352 1 ⒈ 0
55356 2 🄂 0
185 1 ¹ 0
9312 1 ① 0
189 1 ½ 0
55356 2 🎅 0
57 307 /*...*/ 1
57 308 /*...*/ 1 --??
57 309 /*...*/ 0 --??
57 310 /*...*/ 0
0
실제로 잘 캐스팅 된 값 중 5 개를 잘못보고한다는 것money
입니다. 다른 것들은 정확 해 보입니다. SQL FIDDLE