select len('a') select len('') 위 두개의 쿼리 결과가 1로 같습니다. Sybase 12.5 에서 버그 같은데 다른 버젼에서도 그런가요?
맞습니다. ''도 null이 아닌 space입니다. 그러므로 1이 맞습니다
select @@version -------------------------------------------------------------------------------------------------------------------------------- Sybase IQ/12.6.0/061010/P/ESD 7.1/RS6000MP/AIX 5.1.0/64bit/2006-10-10 14:26:01
1 Row(s) affected .
select length('a') ----------- 1
select length('') ----------- 0
1 Row(s) affected
iq는 위의 결과가 맞고요, ase는 1이 나오는게 맞습니다. len은 char_length와 같은 function인데, char length가 0이 있을수는 없지요. 1보다 크거나 아니면 null 이거나 이지요~~
1. 문자열이 1보다 크거나 null이라는 견해에 대해 null 문자열과 과 길이가 0인 문자열은 다릅니다. 내부 구현이야 언어마다 다르겠지만, 문자열의 헤더/트레일러가 할당되느냐의 차이를 나타냅니다. SQL에서는 한술 더떠서 뒷 꼬리에 붙은 공백(ascii code 32)를 무시합니다. 하단의 쿼리를 보죠~ >select '' as col1, null as col2 into #temp >select * from #temp 출력결과는 col1 과 col2는 결과가 다릅니다. 문자열이 항상 1보다 크거나 null 이라면 위의 결과가 나올 수 있을까요? 2. ''은 space라는 견해에 대해 SQL에서 공백이 아닌 문자 앞의 공백은 제거하지 않는다는 것을 생각해 보면 논리적으로 문제가 있는 부분입니다.'' 가 공백(ascii code 32)과 같다면, 실제 Sybase 상에서의 결과는 논외로 치고 다음의 두 결과는 같아야 합니다. > '' + 'a' > ' ' + 'a' 결과는 같지 않죠. 더구나 이렇게 되면 길이가 1인 문자열과 길이가 1인 문자열을 더해서 길이가 1인 문자열이 나온다는 엉뚱한 산수도 허용이 되버립니다(프로그래밍 언어에서 '' 문자열의 길이는 항상 0입니다. 1인 경우는 프로그래머가 클래스를 그렇게 작성한 경우를 제외하고는 아마 없을 겁니다). MS-SQL에서 하단의 쿼리를 테스트 해봤는데 결과는 1, 0 입니다. Oracle이나 Sybase15에서는 어떨지 모르겠네요. >select len('a') >select len('') ps. 까칠하게 따지고 들어서 죄송하긴 합니다만 설명을 위해서 그런 것이니 이해해 주세요.