숫자가 아닌 값을 숫자 열에 삽입하지 않고 SQLite가 유용하지 않습니까?


10

SQLite에서 다음 명령문이 성공하고 문자열이 SALARY유형 의 열에 삽입 / 업데이트됩니다 INTEGER.

update employee set salary='TOO MUCH' where emp_id=1;

0은 삽입 / 업데이트되지 않지만 실제 "TOO MUCH " 문자열이므로, 이것은 형식적인 형식 변환에 관한 것이 아닙니다.

FAQ는 다음과 같이 말합니다.

이것은 버그 가 아닌 기능 입니다. SQLite는 동적 타이핑을 사용합니다. 데이터 형식 제약 조건을 적용하지 않습니다. 모든 유형의 데이터는 일반적으로 모든 열에 삽입 될 수 있습니다. 임의의 길이의 문자열을 정수 열, 부울 열의 부동 소수점 숫자 또는 문자 열의 날짜에 넣을 수 있습니다. CREATE TABLE 명령에서 열에 할당 한 데이터 유형은 해당 열에 넣을 수있는 데이터를 제한하지 않습니다. 모든 열은 임의의 길이 문자열을 보유 할 수 있습니다. (한 가지 예외가 있습니다. INTEGER PRIMARY KEY 유형의 열은 64 비트 부호있는 정수만 보유 할 수 있습니다. 정수 이외의 다른 것을 INTEGER PRIMARY KEY 열에 넣으려고하면 오류가 발생합니다.)

그럼에도 불구 하고이 동작은 의도적입니다. 그럼에도 불구하고 SQLite 에이 동작이있는 이유 가 궁금 합니다. 내가 알고있는 대부분의 다른 SQL 데이터베이스는 상당히 다르게 동작하기 때문에 숫자가 아닌 문자열을 삽입하려고 할 때 오류가 발생하거나 문자열 0을 변환합니다. 숫자 열.

  • 이 동작이 없으면 SQLite 라이브러리가 유용하지 않습니까?

  • 라이브러리를 작고 빠르게 유지하기 위해 의도적으로 설계된 것입니까?

  • 숫자 열에 문자열을 삽입하려고 할 때 오류가 발생하기 위해 SQLite 라이브러리가 상당히 느리거나 더 커 집니까?


9
누군가는 한때 "마케팅 부서에서 설명한 기능은 버그"라고 말했습니다.
Dan Pichelman

3
코드 크기에 유리할 수는 있지만 성능 및 데이터 밀도에 도움이되지는 않습니다. 대체로 나는 그것을 의도적 인 (혹은 채택되지 않은) 잘못된 기능이라고 부를 것이다.
중복 제거기

3
"... 일반적으로 실시간 성능을 요구하는 임베디드 시스템에 사용되는 작은 크기, 낮은 자원 라이브러리 유지하기 위해 나에게 부과 된 제한을 보인다" 내가 하락보다 더 아무것도되는 유형 검사를 상상할 수 없다 임의의 양의 디스크 IO를 수행하는 작업의 시간 / 공간 성능 버킷 또한 데이터의 크기가 고정되어 있다고 가정 할 수 없기 때문에 코드를 추가로 확인해야하므로 동적 타이핑에 성능이 저하 될 수 있습니다.
Doval

1
@DocBrown 그렇게 말하는 것은 아니지만 sui generis 때문 입니다.
Tulains Córdova

2
@ user61852 질문을 완전히 다시 작성하고 SQLite의 동적 타이핑이 성능 이점을 제공하는지 여부에 초점을 맞추고 X / Y 컨텍스트에서 동적 타이핑의 기능 / 버그 구별 또는 일반적인 유용성 / 쓸모없는 언급은 생략하십시오.
Doval

답변:


8

아니요, 동적 타이핑에는 더 많은 저장 공간과 더 많은 처리 시간이 필요합니다. 특히 유형 선호도를 추가하기 때문에 프로그래머가 무시할 수있는 기본 유형이 있습니다. 실제 트레이드 오프 비용이있는 의도적 인 기능입니다. 이러한 비용은 SQLite 대상의 사용 사례에서는 사실상 무시할 수 있지만 여전히 존재합니다.

이러한 기능을 사용하는 데 익숙하지 않기 때문에 이러한 기능의 유용성을 파악하기가 어렵습니다. 부족한 문제에 대한 해결 방법은 이제 더 자연 스럽습니다. 이전의 경험으로 인해 INTEGER 필드 는 다른 어떤 것도 될 수없는 INTEGER 필드 로 생각 하지만 SQLite는이를 모든 유형의 필드로 보지만 대부분 정수를 포함합니다. 아마도 미국에서 주로 비즈니스를 수행하지만 소수의 캐나다 고객이있는 회사의 우편 번호 일 수 있습니다. 사용자가 정수 선호도를 지정할 수 있도록 허용하면 모든 행에서 문자열을 만드는 것보다 많은 공간이 절약되지만 여전히 해당 옵션을 제공합니다.


3
문자열 "TOO MUCH" 를 숫자 열에 성공적으로 저장하는 방법에 대한 내 질문에 대한 업데이트를 작성했습니다 . 자동 변환은 0을 삽입합니다. 또한 이것이 내가 허용하는 첫 번째 관계형 데이터베이스 구현입니다. MSSQLServer, Oracle, PostgreSQL, MySQL, MS Acces, DBase, Foxbase, COBOL 및 Sybase SQL Anywhere와 함께 일했습니다.
Tulains Córdova

2
귀하의 의견을 이해하지 못합니다. 내 대답은 자동 변환과 관련이 없습니다.
Karl Bielefeldt

1
SQLite는 데이터 유형 대신 스토리지 클래스를 고려합니다. sqlite.org/datatype3.html
JeffO

1
명확하게 기록되기 위해 Upvoted,하지만 당신은 하는 문제를이 원인을 무시하고 데이터의 정확성을 증명합니다. DB에서 일부 정수를 가져올 수 없으며 정수라고 가정하십시오. ( "동적 입력은" 격렬 와 확률에 실제 관계형 모델 자체 .)
와일드 카드

1
타이핑을 완전히 무시하는 비용은 작은 저장 공간과 프로세서 시간보다 훨씬 높습니다.
DeadMG
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.