웹 환경에서 Character Set 과 Database의 Collation은 정말 볼 수록 정리가 안되네요...

영문 서버 환경에서 한글 웹사이트를 넣다보니 당면하게된 문제로 시작해 끝이 보이질 않아요 ㅎㅎ


다행히 많은 분들의 도움으로 방법은 찾았지만... 왜 이런 방법으로 해결이 되는 것인지 이유는 파악하지 못했네요..


이와 관련해 여러 궁금증이 있지만 질문을 할 수 없을만큼 저도 정리가 안되서... 어떻게 정리하고 무엇을 질문해야 할지

몰라 그냥 이곳에 생각나고 추측한대로 써봅니다...

내용 정리가 되신 분들의 의견이나 조언을 구해 봅니다.


웹 환경에서...

우리는 브라우저를 통해 웹페이지를 접근했을 때 해당 웹페이지의 문자를 어떤 문자셋(Char Set)으로 해석하고 봐야할지에 대해

HTML Meta Tag인 CharSet 값으로 결정 하죠.. 맞나요? ㅎㅎ

그 값이 euc-kr인 경우 완성형 한글이구요...


그런데... 우리는 단순히 웹 페이지에 코딩되어 있는 HTML 코드와 정적인 문자로 나타나는 contents만 보는 것이 아니죠...

때론 DB에 저장된 데이터와 사용자의 Action에 따른 contents를 웹브라우저로 보게 됩니다.

여기에 asp나 php같은 대표적 서버사이드 스크립트 언어와 MS-SQL 및 MySQL 같은 Database가 사용되구요...


그래서... asp나 MS-SQL 단계에서도 Client와 Server 간의 데이터를 주고 받을 때 문자에 대한 문자셋을 결정해 주어야

하는 것이 맞나요?


그렇다면 ASP는 CodePage, Session.Codepage, response.charset 같은 것들이 있고...

MS-SQL은 collation ... 이것 밖에 모르겠네요...


여기서 의문점...

ASP에서 CodePage 값을 949로 해주면 HTML의 Meta Tag CharSet "euc-kr"과 같은 것인가요?

CodePage = 65001 은 CharSet "utf-8" 과 같은 것이구요?


맞다면... 일단 ASP단계와 HTML 단계에 대한 Character Set 설정은 맞춰 줄 수 있게 되었군요...

그럼 남은 문제는 DataBase...


사실 이 마지막 문제가 중요하고 가장 난해한데요...

MS-SQL에서 varchar/char/text 문자열 타입의 컬럼들은 collation 설정이 존재하잖아요...


collation = 데이터 정렬

이거 가만히 살펴보니... 그냥 정렬을 위한 기준으로 어떤 문자셋을 사용하라는 설정일 뿐

해당 컬럼에 데이터가 Insert 되거나 select 될 때 어떤 문자셋으로 저장 또는 출력 해줄지에 대한 설정은 아닌 듯 합니다.


말이 어려워졌는데요...

쉽게 말해 euc-kr(949) 문자셋 환경의 웹페이지에서 사용자가 문자를 입력하고 그 입력된 문자들을

DB에 저장할 때 (INSERT 할 때) 해당 문자들은 Database 서버에서 어떤 문자셋으로 받아들이고 어떤 문자셋으로 컬럼에

저장시키는지 모르겠다는 것입니다.

그리고 그 요소가 collation은 아니라는 것이죠... 왜냐하면 collation은 그냥 정렬에 대한 기준일 뿐이니까요...


이런 생각이 맞다면...

MS-SQL은 문자열 타입의 컬럼에 데이터가 저장될 때 그냥 웹에서 설정된 문자셋 (euc-kr, 949) 으로 DB에 저장 되는 것일까요?

아니면... OS 나 MS-SQL Server의 환경에 따르는 것일까요?

후자의 경우라면 그 내용은 어떻게 되는 것일까요?


반대로...

DB에 저장된 데이터가 웹페이지에 뿌려지는 과정에서

DB의 컬럼내용(문자들)은 어떤 문자셋으로 ASP로 보내지는 걸까요?

ASP는 CodePage 값으로 949값을 설정했으니 DB에서 넘어오는 컬럼의 내용들이 euc-kr(949) 문자셋으로 넘어오지

않으면 깨진 문자를 담겠죠? 해석이 안될 테니까요...


이번에 제가 격은 문제는 바로 이 부분이었습니다.

저는 한국에서 운영되던 euc-kr 문자셋 환경의 웹사이트를 해외 서버로 이전시켰고...

DB는 복원작업으로 처리하였습니다.


다른 것은 바뀐게 없고 단지 웹서버와 MS-SQL 서버의 환경이 영문으로 바뀌었다는 것 밖에는 없죠...

그런데 Database에서 불러온 모든 한글 문자는 ??? ?? 이와 같이 물음표로 표시되었습니다.


이 시점에서 저는 우선 기존에는 없었던 ASP의 PageCode 값을 첫 줄에 추가해 주었습니다.

그리고 Database의 테이블 하나를 선택해서 varchar 타입의 컬럼을 nvarchar 타입으로 바꿔 주었죠...


일단 ?? 물음표로 나오던 한글 문제는 해결 되었지만...

도대체 왜... ???? 이유를 모르겠습니다...


ASP 페이지에서 CodePage를 설정해 주어야 한다는 것은 대충 이해가 좀 되긴 합니다.

왜냐하면 DB에서 가져온 데이터를 어떤 문자셋으로 처리할 것인지 결정할 필요가 있을 테고 그런 의미에서

CodePage가 설정되어야 한다는 타당성이 있었죠... (하지만 이것도 왜 한글 서버에서는 없어도 되는지는 모르겠음)


그런데 Database의 컬럼에 대한 데이터 타입은 왜 nvarchar로 바꿔줘야 하느냐 입니다....

이 작업을 안해주고 그냥 varchar 타입 상태에서는 ??? 물음표 문제가 해결이 안되더라구요...


여기서 한가지 의문은..

과연 복원한 DB의 varchar / char / text 타입의 컬럼에 저장된 데이터들은 문자셋이 euc-kr(949)로 저장된 것들인가?

하는 의문인데요.. 아무래도... utf-8 방식으로 저장된 것이 아닐까 라는 추측입니다.

왜냐하면... euc-kr 문자셋으로 저장된 데이터라면... asp에서 불러왔을 때 문제가 없어야 정상 아닐까요?

분명 다른 문자셋으로 저장이 되었기 때문에... ASP에서 CodePage를 지정했음에도 불구 ??? 물음표 문제가 해소되지

않았던 것이라고 생각 합니다...


이 추측이 맞다면...

euc-kr(949) 문자셋으로 구성된 웹사이트에서 사용자가 문자를 입력하고 DB로 보낼 때....

그 저장되는 문자들은 대체 어떤 문자셋으로 저장이 되는 걸까요? ㅜㅜ... 

서버의 환경에 따라가는 걸까요? 아니면 ASP에서 Codepage를 지정했으니 그 값을 따라 가는 걸까요?...


지금까지의 내용만으로도 정말 정리가 안되죠? ㅎㅎ

확실하게 아는 내용이 없어서 이리 생각해보고 저리 생각해보며 궁금한 내용을 적다보니...

읽기 힘들게 되었네요...


이에 관련하여 의견 주신다면 많은 도움이 될 것 같아서... 조언을 기다려 봅니다...

긴 글 읽어 주셔서 감사합니다.

No. Subject Author Date Views
Notice 2023년 1월 - SQLER의 업데이트 강좌 리스트 코난(김대우) 2023.01.02 477
7069 셀렉트한 A와 셀렉트한 B 가 서로 다른 값을 가지고 있는 지 확인할려고하는데 시간이 너무 걸리네요... [10] 뽀구 2013.08.07 4865
7068 같이 산 제품 통계 [1] 냥냥 2013.08.06 5018
7067 insert ~ select 구문 성능 관련 [5] 냥냥 2013.08.06 24388
7066 트리거 질문입니다. [3] memento 2013.08.06 36401
7065 서버 부하체크할수 있는 방법을 알고 싶어요 [4] 비홍 2013.08.06 28717
7064 다른 세션에서 트랜잭션 컨텍스트를 사용 중입니다. [2] 박찬용_290198 2013.08.06 28550
7063 sql 2008에서 랜덤하게 숫자를 생성할때 [1] 민성 2013.08.05 5694
7062 각각 레코드에서 다른 래코드의 속성의 대한 연산을 할수 있나요? kimjunhong 2013.08.05 4783
7061 로그인 제한 관련 질문입니다. [1] memento 2013.08.05 41654
7060 [관리] 백업 파일 삭제 [2] 쓰름매미 2013.08.05 6482
7059 이중 커서 사용 그리고 원하는 데이터 추출을 위한 속도개선 방법.. [2] Larry 2013.08.03 14835
7058 서버2012 설치에 큰 문제가 있습니다 도와주세요 [2] P.H 2013.08.02 5494
7057 킬럼에 A, B, C 형태로 문자열이 있고 이걸 in 인라인 쿼리로 조회가 가능할까요? [2] 백승희_291263 2013.08.02 4745
7056 이건 쿼리를 어떻게 잡아야 할까요? [2] 카루카루 2013.08.02 5001
7055 암호 변경 로그 정보 확인 방법 문의 [7] 껄껄껄 2013.08.02 5295
7054 row_num 관련 질문 드립니다. [2] 형님 2013.08.02 4474
7053 db 저장방식 질문입니다. [4] 거저먹네 2013.08.02 5324
7052 시스템 카탈로그 임의 수정이 안되네요.. [2] Larry 2013.08.01 4194
» 웹사이트의 CharSet 설정과 Database의 Collation ... 그 외 상관 관계... Larry 2013.07.31 8385
7050 쿼리문 질문 [6] 황영식_314681 2013.07.30 4486





XE Login