...
...
고개님이 테드폴허브에서 캐릭터셋 처리에 대해 문의해 오셨고 다음과 같은 내용을 보내오셨습니다.
제가 테스트를 해보니, 좀 더 확인해봐야겠지만.... jdbc connection string 에 characterEncoding 을 지정하지 않은경우, 서버의 character_set_server 값을 가져와 session의 character_set_client, character_set_connection, character_set_results 를 서버의 character_set_server 값으로 맞춰주게 됩니다. 이때, 억지로 set names를 하게되면, 위의 3개의 변수들은 set names 의해 변경된 값이 되어버리는데요 이때 문제가 발생합니다. 현재 문제가 되는 경우는 "데이터가 euckr 이고, 서버의 character_set_server가 euckr 로 설정되어 있고. Tadpole의 JDBC connection string에서 characterEncoding 을 지정하지 않으면서 set names utf8 이 실행되는 경우입니다. A) 서버의 character_set_server 변수를 가져와, 통신하는 character set과 character_set_client, character_set_connection, character_set_results 의 값을 euckr 로 내부적인 세팅을 거칩니다. B) 여기서 set names utf8을 하게 되면 (information_schema의 database character set=utf8), character_set_client, character_set_connection, character_set_results 이 utf8 로 변경되지만, 여전히 통신하는 character set 은 euckr 이 됩니다. 그렇다면, 다음과 같은 에러가 발생합니다. Illegal mix of collations (euckr_korean_ci,IMPLICIT) and (utf8_general_ci,COERCIBLE) for operation '=' -- 내부(IMPLICIT)적인 데이터는 euckr_korean_ci 이지만, set names 에 의해 강제로 변환(COERCIBLE)한 utf8_general_ci 과는 연산을 할 수 없다. -- 통신은 euckr 로 하지만, 데이터를 주고 받는형태는 utf8이기 때문입니다. 이문제를 피해가기 위해서는 set names 와 jdbc connection 옵션의 character set은 같은 값을 가져야 정확한값을 도출할 수 있습니다. (jdbc connection string을 지정하지 않은 경우 character_set_server 의 값이 적용됨) 아래의 조건하에서 TEST가 필요해 보입니다. * JDBC connection string 에서 characterEncoding=utf8 로 넣어주시고, set names 구문을 날리지 않고 비교작업을 진행해주세요. (통신 character set만 utf8이라고 알려주고, mysqld에게 모든 변환을 맡기는 방법) |
---|
하여서...
테드폴허브 에서 MySQL Character 설정은 다음과 같습니다.
...
set name을 해주지 않았을 경우. (connect 문자열에 characterEncoding=utf8 이 설정 함)
- 이미 입력된 데이터의 한글이 깨져 보이지 않고, 데이터 입력시(insert, update) 한글이 정상으로 보이고, 깨지지 않는 것을 확인.
...
set name을 해주지 않았을 경우. (connect 문자열에 characterEncoding=utf8 이 설정하지 않음)
...