Oracle이 null 문자열과 빈 문자열을 구분하지 않습니까?
Oracle은 빈 문자열과 null을 구분하지 않는 것 같습니다.예.
Select name from TABLE_A where id=100;
ID NAME
100 null
Update TABLE_A set NAME='' where id=100;
SELECT -->
ID NAME
100 null
SELECT length(NAME) FROM TABLE_A WHERE id=100;
null
Oracle이 이러한 방식으로 작동하도록 구축된 이유를 알 수 없습니다(sqlplus에서도 이 기능을 수행합니까?).-java 인터페이스를 통해 접속하고 있는데, php 클라이언트를 사용한 기사입니다.)
적어도 0 길이와 정의되지 않은 길이를 구분하고 싶지 않나요?이것은 알려진 문제입니까?특정 목적을 위한 의도적인 행동?데이터베이스 이론의 오랜 논쟁?왜 그러고 있어?
(이 질문에 대한 Matt Solnit의 답변이 계기가 되었습니다.)
Oracle
매우 매우 오래되었습니다.
인 로뒤80's
그것이 개발되었을 때 (그리고 어떤 기준이 있기 전에) 그들은 이것이 좋은 생각이라고 생각했고, 그때는 그렇게 주어졌습니다.Oracle
그것의 가치를 저장합니다, 정말 그랬습니다.
배건Oracle
데이터 저장(매뉴얼 참조):
데이터 유형은 데이터 내에 저장되지 않으며 데이터 길이와 데이터 자체만 저장됩니다.
에 약에만.NULL
두 열 사이에 열 가 값이 있 는 두 열 사 이 에 발 생 하 며 있 길 음 의 가 을 미 하 는 됩 저 장 니 단 열 다 이 바 이 로 트 일 이 ▁meaning ▁has ▁occurs 됩 ▁column ▁length ▁byte 니 , ▁columns ▁with ▁as ▁single 장 다값▁a▁between▁it이저▁two▁values▁stored'로트 바열이이0
(웃음)0xFF
). 후행.NULL
s는 전혀 저장되지 않습니다.
값을 'test'
,Oracle
: 5바이트 저장:04 74 65 73 74
.
빈 과 "" "" "" "" "" ""를 NULL
,Oracle
를 데터길이다음설로됩정니면다하으를이됩으로 만 하면 됩니다.0
.
를 이터를저하경는매우스다니우합마트데장야해▁your다▁on에 저장해야 한다면 현명합니다.20 Mb
비용이 많이 드는 하드 드라이브5,000$
나중에, 표준이 나타났을 때, 그것은 더 이상 좋은 생각이 아니었지만, 그 당시에는 이미 많은 코드가 의존하고 있었습니다.NULL
그리고.''
같은 것이 되는 것.
VARCHAR
그런 구별을 하는 것은 엄청난 양의 코드를 깰 것입니다.
고치기 위해 그들은 이름을 바꿨습니다.VARCHAR
VARCHAR2
(어떤 표준의 일부도 아니다), 다음과 같이 명시했습니다.VARCHAR2
결코 a를 구별하지 않을 것입니다.NULL
빈 문자열을 입력하고 모든 사용자에게 이 데이터 형식을 사용하도록 촉구했습니다.
이제 그들은 아마도 마지막으로 사용한 사람을 기다리고 있을 것입니다.VARCHAR
Oracle
죽을 데이터베이스.
2년 이상 전 OTN: http://forums.oracle.com/forums/thread.jspa?threadID=456874&start=0&tstart=0 에서 이 정확한 주제에 대한 길고 때로는 재미있는 토론을 읽고 싶을 수 있습니다.
안녕, 롭.
그래서 Date와 같은 똑똑한 사람들은 절대 null을 사용해서는 안 된다고 말합니다.
(아니요, 저는 정확해야 합니다.사실 그것은 그가 지난 수십 년 동안 그 주장을 지지하기 위해 언급한 거의 수백 가지 이유 중 하나일 뿐입니다.)
편집
저는 사실 이것에 대해서도 대답하고 싶었습니다.
"VARCHAR가 그러한 구별을 하도록 만드는 것은 수많은 코드를 깰 것입니다."
네, 그리고 확실히, 모든 업데이트에서 "빈 문자열"을 null로 대체함으로써 적어도 표준의 정신을 깨는 것은 덜 나쁜 일입니까?
(참고: null은 어떤 것과도 동일하지 않으며 그 자체와도 동일하지 않기 때문에 빈 문자열을 열에 할당한 후 오라클은 해당 열에 표시하려는 값과 동일하지 않은 값을 제공합니다.와.)
Oracle에서 이 동작이 향후 릴리스에서 변경될 수 있다고 언급한 것 같습니다.언제 어떤 출시가 될지는 언급되지 않았습니다.
금속 잉크에 액세스할 수 있는 경우 노트: 1011340.6을 참조하십시오(불행히도 제한 때문에 노트의 내용을 여기서 복사할 수 없습니다).
금속 잉크에 액세스할 수 없는 경우 여기에 있는 10g 릴리스 2 설명서의 다음 내용을 참조하십시오.
@이안, 당신에게 답장합니다.
Oracle 트리거는 생성된 테이블을 참조할 수 있습니다.
create table t (id number(10) );
create or replace trigger t_bir before insert on t for each row
declare
l_id t.id%type;
begin
select id
into l_id
from t
where id = :new.id;
exception
when no_data_found then
null;
end;
/
SQL> insert into t values (20);
1 row is created.
SQL> select * from t;
ID
----------
20
언급URL : https://stackoverflow.com/questions/1268177/oracle-not-distinguishing-between-nulls-and-empty-strings
'programing' 카테고리의 다른 글
다른 소스로 Python 검색 경로 확장 (0) | 2023.07.20 |
---|---|
SQLite 대 SQL Server (0) | 2023.07.20 |
iBA를 사용한 Oracle SQL DATE 변환 문제Java JDBC를 통한 TIS (0) | 2023.07.20 |
ipython 내부에서 python 스크립트 실행 중 (0) | 2023.07.20 |
꺼내기 요청에서 GitHub 클론? (0) | 2023.07.20 |