programing

Oracle이 null 문자열과 빈 문자열을 구분하지 않습니까?

muds 2023. 7. 20. 22:13
반응형

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데이터 저장(매뉴얼 참조):

alt text

데이터 유형은 데이터 내에 저장되지 않으며 데이터 길이와 데이터 자체만 저장됩니다.

에 약에만.NULL 두 열 사이에 열 가 값이 있 는 두 열 사 이 에 발 생 하 며 있 길 음 의 가 을 미 하 는 됩 저 장 니 단 열 다 이 바 이 로 트 일 이 ▁meaning ▁has ▁occurs 됩 ▁column ▁length ▁byte 니 , ▁columns ▁with ▁as ▁single 장 다값▁a▁between▁it이저▁two▁values▁stored'로트 바열이이0 (웃음)0xFF). 후행.NULLs는 전혀 저장되지 않습니다.

값을 'test',Oracle: 5바이트 저장:04 74 65 73 74.

빈 과 "" "" "" "" "" ""를 NULL,Oracle를 데터길이다음설로됩정니면다하으를이됩으로 만 하면 됩니다.0.

를 이터를저하경는매우스다니우합마트데장야해▁your다▁on에 저장해야 한다면 현명합니다.20 Mb비용이 많이 드는 하드 드라이브5,000$

나중에, 표준이 나타났을 때, 그것은 더 이상 좋은 생각이 아니었지만, 그 당시에는 이미 많은 코드가 의존하고 있었습니다.NULL그리고.''같은 것이 되는 것.

VARCHAR그런 구별을 하는 것은 엄청난 양의 코드를 깰 것입니다.

고치기 위해 그들은 이름을 바꿨습니다.VARCHARVARCHAR2(어떤 표준의 일부도 아니다), 다음과 같이 명시했습니다.VARCHAR2결코 a를 구별하지 않을 것입니다.NULL빈 문자열을 입력하고 모든 사용자에게 이 데이터 형식을 사용하도록 촉구했습니다.

이제 그들은 아마도 마지막으로 사용한 사람을 기다리고 있을 것입니다.VARCHAROracle죽을 데이터베이스.

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

반응형