[mysql] MySQL, NULL 또는 빈 문자열을 삽입하는 것이 더 낫습니까?

웹 사이트에 다양한 입력란이있는 양식이 있습니다. 일부 필드는 선택 사항이지만 일부 필드는 필수입니다. 내 DB에는 이러한 모든 값을 보유하는 테이블이 있습니다. 사용자가 데이터를 넣지 않은 DB 열에 NULL 값 또는 빈 문자열을 삽입하는 것이 더 나은 방법입니까?



답변

사용하여 NULL당신이 구별 할 수 “데이터를 넣어 없다”와 “빈 데이터를 넣어”.

더 많은 차이점 :

  • LENGTHNULL이며 NULL, LENGTH빈 문자열은 0입니다.

  • NULL빈 문자열보다 먼저 정렬됩니다.

  • COUNT(message)빈 문자열을 계산하지만 NULLs 는 계산하지 않습니다.

  • 바운드 변수를 사용하여 빈 문자열을 검색 할 수 있지만을 검색 할 수는 없습니다 NULL. 이 쿼리는

    SELECT  *
    FROM    mytable
    WHERE   mytext = ?

    클라이언트에서 전달한 값이 무엇이든 NULLin 과 일치하지 않습니다 mytext. 를 일치 시키려면 NULL다른 쿼리를 사용해야합니다.

    SELECT  *
    FROM    mytable
    WHERE   mytext IS NULL

답변

당신이 경우 고려해야 할 한 가지는 지금까지 데이터베이스를 전환 계획이 있다는 것입니다 오라클은 빈 문자열을 지원하지 않습니다 . 그것들은 자동으로 NULL로 변환되며 같은 절을 사용하여 쿼리 할 수 ​​없습니다 WHERE somefield = ''.


답변

명심해야 할 한 가지는 NULL이 코드 경로를 훨씬 더 어렵게 만들 수 있다는 것입니다. 예를 들어 Python에서는 대부분의 데이터베이스 어댑터 / ORM이에 매핑 NULL됩니다 None.

따라서 다음과 같은 것들이 있습니다.

print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow

“안녕하세요, Joe Doe!” 이를 피하려면 다음 코드가 필요합니다.

if databaserow.title:
    print "Hello, %(title)s %(firstname) %(lastname)!" % databaserow
else:
    print "Hello, %(firstname) %(lastname)!" % databaserow

훨씬 복잡한 작업을 수행 할 수 있습니다.


답변

NULLMySQL의 데이터베이스 일관성을 위해 삽입 하는 것이 좋습니다. 외래 키는 NULL빈 문자열로 저장 될 수 있지만 빈 문자열로 저장 될 수는 없습니다.

제약 조건에 빈 문자열 이있는 문제가 있습니다 . 외래 키 제약 조건을 충족시키기 위해 고유 한 빈 문자열 로 가짜 레코드를 삽입해야 할 수도 있습니다 . 나쁜 습관이라고 생각합니다.

참고 : 외래 키가 NULL이거나 중복 될 수 있습니까?


답변

나는 최선의 방법이 무엇인지 알지 못하지만 null이 빈 문자열과 다른 것을 의미하지 않고 사용자의 입력이 빈 문자열 정의와 일치하지 않는 한 일반적으로 null을 선호합니다.

나는 그들이 당신이 어떻게 다른지를 원하는지 정의해야한다고 말하고 있습니다. 때로는 그것들을 다르게하는 것이 합리적이며 때로는 그렇지 않습니다. 그렇지 않다면, 하나만 골라 붙입니다. 내가 말했듯이, 나는 대부분 NULL을 선호하는 경향이 있습니다.

열이 널 (null) 인 경우 널 (null) 열에 대한 선택이 아닌 한 해당 열을 기반으로 선택하는 (SQL 용어에 where 절이있는) 모든 쿼리에 레코드가 거의 나타나지 않을 것임을 명심하십시오. 물론이야.


답변

고유 인덱스에서 여러 열을 사용하고 있고 이러한 열 중 하나 이상이 필수 (예 : 필수 양식 필드) 인 경우 인덱스의 다른 열을 NULL로 설정하면 중복 된 행이 생길 수 있습니다. 고유 한 열에서는 NULL 값이 무시되기 때문입니다. 이 경우 중복 된 행을 피하려면 고유 인덱스의 다른 열에 빈 문자열을 사용하십시오.

고유 인덱스의 열 :
(event_type_id, event_title, 날짜, 위치, URL)

실시 예 1 :
(1, 'BBQ', '2018-07-27', null, null)
(1, 'BBQ', '2018-07-27', null, null) // 허용 및 복제

예 2 :
(1, 'BBQ', '2018-07-27', '', '')
(1, 'BBQ', '2018-07-27', '', '') // 중복되므로 허용되지 않습니다.

다음은 몇 가지 코드입니다.

CREATE TABLE `test` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `event_id` int(11) DEFAULT NULL,
  `event_title` varchar(50) DEFAULT NULL,
  `date` date DEFAULT NULL,
  `location` varchar(50) DEFAULT NULL,
  `url` varchar(200) DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `event_id` (`event_id`,`event_title`,`date`,`location`,`url`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;

이제 이것을 삽입하여 복제 된 행이 허용되는지 확인하십시오.

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-27', NULL, NULL);

이제 이것을 삽입하고 허용되지 않는지 확인하십시오.

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

INSERT INTO `test` (`id`, `event_id`, `event_title`, `date`, `location`,
`url`) VALUES (NULL, '1', 'BBQ', '2018-07-28', '', '');

따라서 여기에는 옳고 그름이 없습니다. 비즈니스 규칙에 가장 적합한 것을 결정하는 것은 사용자의 몫입니다.


답변