336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

리눅스에 서버를 세팅하고,

로그를 확인할때... 한글이 깨질때... 당황할때가 있다!

그럼 하나만 보면 되는게 아니라... 캐릭터 셋 설정한데를 다 찾아봐야한다...

그래서 한글이 깨지면.. 쉽게 해결이 안될때가 있다..ㅠ,ㅠ

 

 

프로젝트라던지 server.xml이라던지 머 웬만한 내가 아는데 다했는데..

로그볼때 깨진다면!!! 로그를 뿌려주는 catalina 에서 인코딩 설정을 해보자!!

 

 

저 같은 경우에 이와 같이 글자가 깨졌었습니다...

putty 에서도 UTF-8로 설정하고, 나머지도 거의 다 해줬다고 생각했는데, 알아보니 카타리나쪽이 빠졌었더라고요!!

 

catalina.sh 파일을 열어서,

 

 

상단에,

 

JAVA_OPTS="$JAVA_OPTS -Dfile.encoding=UTF-8 -Dfile.client.encoding=UTF-8 -Dclient.encoding.override=UTF-8"

 

※ 참고로.. 변수명과 값 사이에 띄어쓰기는.. 절대 안됩니다... 저 이것때문에... 하루 넘게 날린것 같아요...

     JAVA_OPTS ='블라블라', JAVA_OPTS = '블라블라', JAVA_OPTS= '블라블라'

   절대 조심하세여.. 얘네들 안됩니다... 딱붙여야대요!!!!!!

 

이 내용을 작성해주고 서버를 내렸다 올라리면 다음과 같이 깨지지 않고 잘 보이는것을 확인 할 수 있었습니다!!

 

(그나저나... 필자는.. 아직 초보 개발자에.. shell에 대한 경험의 없기에.. catalina.sh 의.. 자세한 shell 구문의 내용은.. 모릅니다..ㅠ,ㅠ 훗날엔.. 더 자세히 포스팅 하는 날이 오기를.. 바라며.. 포스팅을 마칩니다.. 오늘도 좋은 하루 되세요!ㅎ)

 

 

'ERROR' 카테고리의 다른 글

JSON.parse 에러  (0) 2018.11.19
<session-config> element is limited to 1 occurrence  (0) 2017.08.29
javax.naming.NameNotFoundException  (0) 2017.08.23
@TargetApi ?  (0) 2014.11.05
Invalid file name: must contain only [a-z0-9_.]  (0) 2014.10.21
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

 

서버 잘 띄우고 DB 커넥션을 하려고 하면 똭!! 에러가 뜹니다.. 이런..ㅠ,ㅠ

리눅스 서버에 띄워서... 로그로 찍은거라... 화면이 어둡습니다!

 

머... 이 내용에 대해서 간략하게 머가 문제냐를 보면 cneMsg라는 이름을 가진 녀석을 못찾는답니다...

(저같은 경우에는 톰캣에 JNDI 설정을 해놓았습니다...)

lookup이라는 놈이 JNDI 설정해놓은 이름을 찾는 건데 cneMsg라는 녀석을 아무리 찾아도 없다는 겁니다!!

그래서 에러가 발생한겁니다!!!

 

그래서 결론은!!

데이타소스를 설정한 부분 즉, DB를 설정한 부분을 찾아가시면,

네이밍 부분이 잘못되셨다는 것을 아실수가 있으실 겁니다!!

네이밍만 잘 맞춰주시면, 잘 돌아가는 것을 확인 하실 수 있을겁니다!!ㅎ

(어떻게 보면 간단한 문제인데, 아직 개발 초보자로썬 영어로 막막 엄청 길게 에러가 뜨다보니 겁 먹을수 있는것 같습니다.ㅠ)

'ERROR' 카테고리의 다른 글

JSON.parse 에러  (0) 2018.11.19
<session-config> element is limited to 1 occurrence  (0) 2017.08.29
linux Tomcat catalina log 한글(글자) 깨짐  (0) 2017.08.23
@TargetApi ?  (0) 2014.11.05
Invalid file name: must contain only [a-z0-9_.]  (0) 2014.10.21
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.

 

오라클에서 문자타입을 사용 하다 보면 CHAR, VARCHAR, VARCHAR2를 보실수 있습니다.

처음에는 아무생각 없이 쓰다가 어느순간 문제가 발생 해 검색을 하는 경우가 생길 거라 생각이 듭니다.

그 순간 이 포스팅을 보시고, 도움이 되셨으면 좋겠습니다.

(완전 완벽히 자세히 알려드리지는 못할 수 있지만 사용하는데 최대한 지장이 없도록 열심히 작성하였습니다!)

 

우선 간단하게 비교표를 보면,

 

CHAR는 고정형이고, VARCHAR는 가변형이라고 적혀있습니다.

고정형은 말그대로 고정적일때 사용해야 하고, 가변형은 변화가 있는 컬럼에 대해 사용해야 한다는 것입니다.

이 말이 처음에는 먼가 하실 수 있습니다.

(저도.. 그랬습니다.. 심지어 처음 배웠을때는 아 그런가보다 하고 넘겼던 것 같습니다..)

그래서 이해를 돕기 위해 예제를 한번 만들어봤습니다.

 

CREATE TABLE TEST_CHARACTER(
 T_CHAR CHAR(4),
 T_VARCHAR VARCHAR(4),
 T_VARCHAR2 VARCHAR2(4) 
);

 

INSERT INTO TEST_CHARACTER VALUES('A', 'A', 'A'); 

 

테스트 테이블을 만들고, 각각 CHAR, VARCHAR, VARCHAR2 문자형을 가지는 컬럼에 똑같은 문자 A를 넣습니다.

 

 

이 상태에서 고정형과 가변형의 차이를 볼 수 있게 셀렉트를 해보겠습니다.

 

SELECT  DECODE(T_CHAR, 'A   ', 'TRUE', 'FALSE')         T_CHAR,
           DECODE(T_VARCHAR, 'A   ', 'TRUE', 'FALSE')    T_VARCHAR,
           DECODE(T_VARCHAR2, 'A   ', 'TRUE', 'FALSE')  T_VARCHAR2
FROM   TEST_CHARACTER;

 

※ 참고로 DECODE 함수는 IF문 같은 함수입니다. DECODE(컬럼, '비교값', '같으면 요기', '다르면 요기') 

위와 같이 셀렉트를 하면 아래와 같은 결과가 나옵니다.

 

 

간략하게 설명을 드리면,

비교값의 문자는 'A∨∨∨' (A공백백공백) 입니다.

공백이 포함되자 CHAR 같은 경우에는 TRUE가 나왔고, VARCHAR나 VARCHAR2는 FALSE가 나왔습니다.

VARCHAR나 VARCHAR2 같은 경우에는 우선 같다고 보고 CHAR와 VARCHAR를 비교해서 설명해드리겠습니다.

 

CHAR 같은경우에는 4byte로 공간을 잡았는데, 문자가 4byte가 다 안채워지면 나머지가 공백으로 채워지도록 되어 있습니다.

그렇기 때문에 나는 분명히 A 라는 문자를 넣었는데, 자동적으로 'A∨∨∨' 가 되어 공백을 집어넣어야 TRUE 가 되는 것을 볼 수 있습니다.

이런 의미로 고정형이라는 말이 쓰이는 것입니다. 왜냐면 공백이 채워지지 않게 하기위에선 할당한 공간을 꽉채워야 하기 때문입니다.

예를들어 형식을 정한 날짜라던지 주민등록번호 처럼 절대 글자수가 변화가 되지 않는 경우에 사용하면 적당하다고 볼 수 있습니다.

(하지만 일반적으로는 VARCHAR로 공백을 생각치 않고 쓰는 경우가 많은것 같습니다.)

 

반면 VARCHAR는 4byte를 할당하고 'A'라는 1byte의 문자를 입력하면 CHAR와는 다르게 공백이 채워지는것이 아니라 입력한 부분만 쓰입니다.

이런 의미로 가변형이라는 말이 쓰이는 것입니다. 왜냐면 할당한 영역은 4byte 지만 나는 꼭 4byte를 쓰지 않고 매번 다를 수도 있기 때문입니다.

예를들어 아이디라는 컬럼이 있으면 그 컬럼은 매번 다른 수의 글자가 입력이 될 것입니다. 그럼에도 공백이 채워지지 않기에,

걱정없이 컬럼을 사용 할 수가 있으니 글자수의 변화가 있는 경우에 사용하면 적당하다고 볼 수 있습니다.

아 그리고, 반대로 'A'문자를 비교했을때를 궁금해하실 수 있으니 보고 가겠습니다.

 

SELECT  DECODE(T_CHAR, 'A', 'TRUE', 'FALSE')         T_CHAR,
           DECODE(T_VARCHAR, 'A', 'TRUE', 'FALSE')    T_VARCHAR,
           DECODE(T_VARCHAR2, 'A', 'TRUE', 'FALSE')  T_VARCHAR2
FROM  TEST_CHARACTER; 

 

위와 같이 셀렉트를 하면 아래와 같은 결과가 나옵니다.

 

 

결과는, 반대로 CHAR만 FALSE가 나오는 것을 볼 수 있습니다.

그러니까, CHAR형태로 컬럼을 만들고 할당 영역을 꽉채우는 데이터가 아니라면, 내가 넣었을땐 'A'라는 문자를 입력했더라도, 조건으로 아무리 비교해봐야 내가 원하는 결과가 나올 수가 없다는 것입니다.

 

다음으로 위에 적혀있는 BYTE수는 데이터 길이 제한의미합니다. (CHAR : 2000byte / VARCHAR, VARCHAR2 : 4000byte)

그리고 VARCHAR와 VARCHAR2 같은경우에는 현재는 차이가 없으나, 오라클쪽에서 추후에 VARCHAR 같은경우에는 다른 형태로 쓰일 수 있다고 합니다.

그렇기 때문에 오라클에서는 VARCHAR보다는 VARCHAR2를 쓰는것을 권장한다고 합니다.

(이 내용은 Oracle10g 어느 문서에 적혀있다고 합니다...)

 

 

그래서 최종결론은!!!

 

§ CHAR는 문자의 길이가 고정적일때 사용하고!!!

§ VARCHAR는 문자의 길이가 변화가 있을때 사용하고!!!

§ 오라클에서는 VARCHAR보다 VARCHAR2를 쓰는 것을 권장한다!!!

 

 

※ 아 참고로... 오라클 기준에 설명 드렸습니다.. 다른 DB도 어느정도 일치하나.. 그렇다고 또 완전히 디테일하게 맞지는 않으니.. 참고하시기 바랍니다..ㅎ

+ Recent posts