2011-08-02 7 views
8

내 삽입 문은 다음과 같습니다빈 문자열이 아닌 널 (null)

INSERT INTO foo (bar) VALUES (''); 

bar 필드과 같이 생성 :

bar INT(11) 
    COLLATION: (NULL) 
    NULL: YES 
    DEFAULT: (NULL) 

MySQL 버전 : 5.1.

빈 문자열에 NULL을 삽입하면 안됩니까? 나는 왜 테이블에 제로 (0)가 저장되어 있는지 알지 못합니다.

+0

또한 mysql "strict mode" –

답변

11

MySQL은 기본적으로 잘못된 값을 올바른 형식으로 강제 변환하려고 시도합니다. 여기서 빈 문자열 ''은 string 유형이며 정수가 아니고 NULL도 아닙니다. 나는 다음과 같은 조치를 취하시기 바랍니다 :

  1. 변경 쿼리를 다음과 : INSERT INTO foo (bar) VALUES (NULL);
  2. 는 MySQL의에서 엄격 모드를 활성화합니다. 이렇게하면 예기치 않은 유형 및 값 변환이 발생하는 것을 방지 할 수 있습니다. MySQL이 예상하지 못한 일을 시도 할 때 더 많은 오류 메시지가 표시되므로 문제를 더 빨리 발견하는 데 도움이됩니다.
+0

# 2는 많이 설명합니다. 고맙습니다. – gravyface

+0

엄격 모드는 매우 중요합니다. MySQL의 기본값은 엉뚱한 데이터에 기대어 있습니다. 개발자는 데이터를 자르지 않고 인식하고 있습니까? 아야. –

5

테이블에 NULL을 삽입하지 않았습니다. 빈 문자열을 삽입하는 것입니다 (이는 분명히 0으로 매핑됩니다). NULL은 SQL의 고유 한 값이라는 것을 기억하십시오. NULL != ''. 어떤 값 (NULL 제외)을 지정하면 NULL이 삽입되지 않습니다. 값을 지정하지 않으면 기본값 만 사용됩니다. 귀하의 예제에서 정수 열에 문자열 값을 지정했습니다.

+0

"을 int로 매핑합니다."그리고 MySQL 매뉴얼에서 "숫자 형의 경우 기본값은 0"이지만 명시 적으로 NULL로 설정된 경우 칼럼에서, 왜 그것을 0으로 설정 하는가? 어떻게 작동하는지 읽는 방법은 _anything_하지만 기본값이 NULL로 설정된 경우 정수를 NULL로 저장해야합니다. – gravyface

+3

값을 입력하지 않은 경우에만 열의 기본값이 적합합니다. 여기에 값을 제공했으나 유효하지 않으므로 MySQL은 그것을 정수로 해석하려고합니다. 그것에 도달하는 해석은 정수 0입니다. – Hammerite

2

이 작업을 수행하는 방법은 필드를 전혀 채우지 않는 것입니다. 실제로 가치가 필요한 것만 채우십시오.

2

왜 NULL이어야합니까? 정수 표현이있는 값을 제공하고 있습니다. 빈 문자열은 INT0으로 변환됩니다.

을 제공하지 않은 경우에만 값이 기본값이됩니다.