programing

MySQL, NULL 또는 빈 문자열을 삽입하시겠습니까?

firstcheck 2022. 9. 6. 00:07
반응형

MySQL, NULL 또는 빈 문자열을 삽입하시겠습니까?

다양한 분야의 웹 사이트에 양식이 있습니다.일부 필드는 선택 사항이고 일부 필드는 필수입니다.내 DB에는 이러한 모든 값이 포함된 테이블이 있습니다. 사용자가 데이터를 입력하지 않은 DB 열에 NULL 값을 삽입하는 것이 더 나은 방법입니까?

사용방법NULL"데이터 없음"과 "빈 데이터 입력"을 구분할 수 있습니다.

기타 차이점:

  • A LENGTHNULLNULL,aLENGTH빈 문자열의0.

  • NULL는 빈 문자열 앞에 정렬됩니다.

  • COUNT(message)빈 문자열은 카운트되지만NULLs

  • 바인드 변수를 사용하여 빈 문자열을 검색할 수 있지만,NULL. 이 쿼리:

    SELECT  *
    FROM    mytable 
    WHERE   mytext = ?
    

    와는 비교가 안 된다NULLmytext클라이언트로부터 건네받은 값에 관계없이,일치시키다NULLs. 다른 쿼리를 사용해야 합니다.

    SELECT  *
    FROM    mytable 
    WHERE   mytext IS NULL
    

데이터베이스를 전환할 계획인 경우 고려해야 할 사항 중 하나는 Oracle이 빈 문자열을 지원하지 않는다는 것입니다.이러한 명령어는 자동으로 NULL로 변환되며 다음과 같은 구를 사용하여 쿼리할 수 없습니다.WHERE somefield = ''.

주의할 점은 NULL로 인해 코드 패스가 훨씬 어려워질 수 있다는 것입니다.예를 들어 Python에서는 대부분의 데이터베이스 어댑터/ORM이 매핑됩니다.NULL로.None.

예를 들어 다음과 같습니다.

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

"Hello, None Joe Doe!"가 될 수 있습니다.이를 방지하려면 다음과 같은 코드가 필요합니다.

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

그래서 일이 훨씬 더 복잡해질 수 있어요

삽입이 용이함NULLMySQL에서 데이터베이스의 일관성을 확보합니다.외부 키는 다음과 같이 저장할 수 있습니다.NULL빈 문자열은 아닙니다.

제약조건에 빈 문자열이 있으면 문제가 발생합니다.외부 키 제약 조건을 충족하기 위해 고유한 빈 문자열이 포함된 가짜 레코드를 삽입해야 할 수 있습니다.나쁜 습관인 것 같아요.

참고 항목: 외부 키는 NULL 또는 복제 가능합니까?

여기에서는 어떤 베스트 프랙티스가 있을지는 모르겠지만, 빈 문자열과 다른 의미를 갖는 null과 사용자 입력이 일치하는 경우를 제외하고 일반적으로 null을 선호합니다.

내 말은 네가 그들이 어떻게 달라지길 원하는지 정의할 필요가 있다는 거야.때로는 다른 것을 갖는 것이 말이 될 때도 있고 그렇지 않을 때도 있다.아니면 하나만 골라서 계속 하세요.말씀드렸듯이, 저는 늘을 선호하는 경향이 있습니다.

또한 열이 null인 경우 해당 컬럼에서 where 절을 선택하는 쿼리에 레코드가 표시될 가능성은 낮습니다(물론 null 컬럼에 대한 선택이 아닌 한).

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

고유 인덱스의 열:(event_type_id, event_module, 날짜, 장소, 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', '', '');

그래서 여기엔 옳고 그름이란 없다.어떤 것이 비즈니스 규칙에 가장 적합한지를 결정하는 것은 사용자에게 달려 있습니다.

언급URL : https://stackoverflow.com/questions/1267999/mysql-better-to-insert-null-or-empty-string

반응형