2011-04-11 5 views
49

NULL비어있는 Varchar 값은 SQL Server에 저장됩니다. 그리고 UIstring 필드에 대한 사용자 입력이없는 경우 NULL 또는 ''을 저장해야하나요?SQL Server : Null VS 빈 문자열

+0

관련 항목 : [SQL : empty string vs NULL value] (http://programmers.stackexchange.com/q/32578/85530) –

답변

47

이 점에 대해 설명하는 멋진 문서 here이 있습니다. 중요한 것은 테이블 크기에 차이가 없다는 것입니다. 그러나 일부 사용자는 NULL 검사가 없으므로 쿼리를 더 쉽게 만들 수 있으므로 빈 문자열을 사용하는 것을 선호합니다. 문자열이 비어 있는지 확인하면됩니다. 주목해야 할 또 하나의 점은 관계형 데이터베이스의 맥락에서 NULL이 의미하는 것입니다. 문자 필드에 대한 포인터가 행 머리글에서 0x00으로 설정되므로 액세스 할 데이터가 없음을 의미합니다.

업데이트 실제로 행으로

각 행은 널 (null)을 허용하는 열에 대한 널 비트 맵을 가지고에 무슨 일이 일어나고 있는지에 대해 이야기 상세한 기사 here있다. 의 열이 null 인 경우 비트 맵의 ​​비트는 1이고 그렇지 않으면 0입니다.

가변 크기 데이터 유형의 경우 실제 크기는 0 바이트입니다.

고정 크기 데이터 유형의 실제 크기는 기본 데이터 유형 크기 인 바이트 (기본값은 0, 숫자는 '')입니다.

DBCC 페이지의 결과는 모두 NULL과 빈 문자열은 0 바이트을 차지 모두 것을 보여준다.

+1

실제로이 점에 대한 설명이 아닙니다. 그것은 정말로 그것을 백업 할 아무 것도없이 자신의 의견을 표현하는 누군가입니다. 그들이 제기 한 유일한 포인트는 공간 요구 사항이 동일하며 두 가지 방법 모두를 지원하지 않는다는 것입니다. – MikeKulls

+0

행/열 단위로 수행되는 작업에 대한 자세한 정보를 제공하도록 업데이트되었습니다. – openshac

+8

"또 다른 주목할 점은 관계형 데이터베이스의 컨텍스트에서 NULL이 의미하는 바는 문자 필드에 대한 포인터가 행 머리글에서 0x00으로 설정되므로 액세스 할 데이터가 없음을 의미합니다." NULL은 관계형 데이터베이스의 컨텍스트에서이를 의미하지는 않습니다. 특정 벤더가 관계형 데이터베이스를 구현할 때만 의미가 있습니다. – Thanatos

1

NULL은 정의되지 않은 것처럼 값이 아닙니다. ''은 0 자의 빈 문자열입니다.
데이터베이스의 문자열 값은 UI의 값에 따라 다르지만 일반적으로 쿼리 또는 저장 프로 시저에서 매개 변수를 지정하면 빈 문자열 ''이됩니다.

12

빈 문자열은 길이가 0 인 문자 또는 문자가없는 문자열입니다. Null에 데이터가 없습니다.

1

NULL 값은 모든 열의 특수 비트 맵 공간에 별도로 저장됩니다.

응용 프로그램에서 NULL''을 구별하지 않으면 ''을 테이블에 저장하는 것이 좋습니다 (단, 문자열 열이 외래 키인 경우에는 열을 금지하는 것이 더 좋을 수 있습니다). 빈 문자열을 저장하지 못하게하고 응용 프로그램의 논리와 호환되는 경우 NULL을 허용합니다.

-2

"NULL"및 "빈 varchar"값은 SQL Server에 어떻게 저장됩니까? 왜 그 사실을 알고 싶습니까? 또는 다른 말로 대답을 알고 있다면 어떻게 그 정보를 사용하겠습니까?

내 UI에 문자열 필드에 대한 사용자 항목이없는 경우 NULL 또는 '?'를 저장해야합니까? 필드의 특성에 따라 다릅니다. 빈 문자열이 필드에 유효한 값인지 확인하십시오.

예를 들어 주소에 집 이름이 있으면 해당 주소가 집 이름이 없음을 알고 있는지 여부에 따라 저장할 수 있습니다.

사람의 이름과 같은 이름이 아닌 경우 사람이 공백 이름 (알고있는 한 모든 문화권에서)이 없기 때문에 null을 저장해야합니다.

+1

나는 그것이 그렇게 중요하지 않다는 것을 알고있다. 그러나 나는 그것을 얻고 싶다. –

30

SQL Server에서 Null과 불일치를주의 깊게 확인하십시오. BLA가 null의 경우

select * from foo where bla <> 'something' 

예를

를 들어

레코드를 반환하지 않습니다. 논리적으로는 그렇지만.

그래서 확인하는 올바른 방법은 물론 사람들이 종종 잊어 버리고 이상한 버그를 얻을

select * from foo where isnull(bla,'') <> 'something' 

될 것이다.

+9

"null = null"이 false를 반환하지만 "null <> 'something' '"을 false로 반환하는 것은 완전히 잔인한 것으로 느껴질만큼 충분히 어렵습니다. – MikeTeeVee

+10

@MikeTeeVee : 두 경우 모두 '거짓'이 아닙니다. 그것은 UNKNOWN이며 조건을 통과시키지 않습니다 (결과가 TRUE 일 때만). –

+2

위의 쿼리는 약간 최적화 될 수 있으며 조금 더 빨라질 것입니다. isnull (bla, '') 'select * from foo를 수행하는 대신'select * from foo where (bla <> 'something') 또는 (bla is null)' – Nicolas

1

외래 키 필드가 아닌 경우 빈 문자열을 사용하지 않으면 문제를 줄일 수 있습니다. 빈 문자열과 다른 것을 의미하기 위해 null을 취하는 경우에만 null을 허용합니다. 예를 들어 암호 필드가있는 경우 null 값은 새 사용자가 아직 암호를 만들지 않았 음을 나타내며 빈 varchar는 빈 암호를 나타낼 수 있습니다. null을 허용하는 "address2"와 같은 필드에 대해서만 생명을 어렵게 할 수 있습니다. Vagif Verdi가 언급 한 연산자 및 null 참조 및 예기치 않은 결과를 포함하여주의해야 할 사항은 종종 불필요한 프로그래머 오버 헤드입니다.

편집 : NULL 및 "빈 문자열"사이 Nullable vs. non-null varchar data types - which is faster for queries?

1

개념적 차이가 실제와 데이터베이스 설계에서 매우 중요하지만, 종종 잘못 이해하고 잘못 적용 - 여기에있다 : 성능은 문제가이 관련 질문을 참조하는 경우 두 가지에 대한 간단한 설명 :

NULL - 값이 무엇인지, 존재할 수도 있지만 존재하지 않을 수도 있음을 알지 못한다는 것을 의미합니다.

빈 문자열 - 값이 무엇인지 알지 못한다는 것을 의미합니다.

다음은 간단한 예제 : FIRST_NAME, middle_nameLAST_NAME에 대한 별도의 열을 포함하여 사람들의 이름을 가진 테이블이 있다고 가정 . first_name = 'John', last_name = 'Doe'및 middle_name 중간에있는 이름이 무엇인지, 또는 심지어 존재하는지 여부를 알 수 없다는 의미입니다. middle_name = ''(즉, 빈 문자열)과 같은 시나리오를 변경하면 중간 이름이 없음을 알 수 있습니다.

SQL Server 강사가 데이터베이스의 모든 문자 유형 열을 필수로 만드는 것을 홍보 한 다음 ''(빈 문자열) 또는 '알 수 없음'에 각각 DEFAULT VALUE를 할당하는 것을 들었습니다. 이 말을하면서 강사는 NULL과 빈 문자열의 차이점을 명확하게 이해하지 못했음을 보여주었습니다.틀림없이, 차이점은 혼란스럽게 보일 수 있지만, 위의 예제는 차이점을 명확히하는 데 도움이됩니다. 또한 SQL 코드를 작성할 때 차이점을 이해하고 빈 문자열뿐만 아니라 NULL도 적절하게 처리하는 것이 중요합니다.

+0

할 수 있습니다. 이것은 보편적으로 객관적인 의견이 아니라는 점을 지적하고자한다. – industryworker3595112

+1

여기서 NULL은 "unknown"을 의미하며 "nothing"/ "not applicable"을 의미하지는 않습니다. 그러나 다른 데이터 유형은 어떻습니까? 테이블에 CONTRACTS가 있고, DATE 유형의 "maturity_date"열이있는 경우 만기일이없는 계약이있는 경우 (예 : 요구 될 때까지 입금). 그런 경우에 그것을 다루는 꽤 받아 들여진 방법은 "maturity_date = NULL"로 남겨 두는 것입니다. (즉, 다른 모든 데이터 유형의 경우 NULL은 "nothing"/ "not applicable"의 경우 적절합니다.) (내 포인트 : null 대 빈 문자열 대 특수 값은 협약의 문제 일뿐입니다) – industryworker3595112

+0

예, 동의해야합니다 이것은 둘의 단일 구현입니다. 합리적이지만 다른 구현도 있습니다. –