아라리요
1k
2013-05-31 17:37:28
42
14154

MySQL 한글 질문입니다.


status로 보면 나오는 characterset을 전부다 utf8로 변경했습니다.
euckr도 해보고 둘 다 해봤는데

ibatis로 한글을 insert 해주거나 update 해주려고할 때 아래의 에러가 납니다.
해결방법 좀 제시해주셨으면 합니다 ㅡ.ㅜ

참고로 SQLyog로 하면 값이 들어가긴 하는데 ??? 물음표로 들어갑니다.
그리고 warning code : 1366 이라고 뜹니다.

com.ibatis.common.jdbc.exception.NestedSQLException:
--- The error occurred while applying a parameter map.
--- Check the updateUserInfo-InlineParameterMap.
--- Check the statement (update failed).
--- Cause: java.sql.SQLException: Incorrect string value: '\xED\x8F\xB0\xED\x8F\xB0...' for column 'trade_name' at row 1
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:107)
at com.ibatis.sqlmap.engine.impl.SqlMapExecutorDelegate.update(SqlMapExecutorDelegate.java:457)
at com.ibatis.sqlmap.engine.impl.SqlMapSessionImpl.update(SqlMapSessionImpl.java:90)
at com.ibatis.sqlmap.engine.impl.SqlMapClientImpl.update(SqlMapClientImpl.java:66)
at com.smartclone.application.auth.dao.AuthDaoImpl.updateUserInfo(AuthDaoImpl.java:51)
at com.smartclone.application.auth.controller.AuthController.getUserInfo(AuthController.java:49)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.springframework.web.method.support.InvocableHandlerMethod.invoke(InvocableHandlerMethod.java:213)
at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:126)
at org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle(ServletInvocableHandlerMethod.java:97)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.invokeHandleMethod(RequestMappingHandlerAdapter.java:647)
at org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal(RequestMappingHandlerAdapter.java:603)
at org.springframework.web.servlet.mvc.method.AbstractHandlerMethodAdapter.handle(AbstractHandlerMethodAdapter.java:80)
at org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:950)
at org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:859)
at org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:883)
at org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:781)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:728)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:305)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.springframework.web.filter.CharacterEncodingFilter.doFilterInternal(CharacterEncodingFilter.java:88)
at org.springframework.web.filter.OncePerRequestFilter.doFilter(OncePerRequestFilter.java:83)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:243)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:210)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:222)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:123)
at org.apache.catalina.authenticator.AuthenticatorBase.invoke(AuthenticatorBase.java:472)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:171)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:99)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:947)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:118)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1009)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:589)
at org.apache.tomcat.util.net.JIoEndpoint$SocketProcessor.run(JIoEndpoint.java:310)
at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source)
at java.lang.Thread.run(Unknown Source)
Caused by: java.sql.SQLException: Incorrect string value: '\xED\x8F\xB0\xED\x8F\xB0...' for column 'trade_name' at row 1
at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:1073)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3603)
at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3535)
at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:1989)
at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2150)
at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2626)
at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2119)
at com.mysql.jdbc.PreparedStatement.execute(PreparedStatement.java:1362)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at com.ibatis.common.jdbc.logging.PreparedStatementLogProxy.invoke(PreparedStatementLogProxy.java:62)
at $Proxy14.execute(Unknown Source)
at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeUpdate(SqlExecutor.java:80)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.sqlExecuteUpdate(MappedStatement.java:216)
at com.ibatis.sqlmap.engine.mapping.statement.MappedStatement.executeUpdate(MappedStatement.java:94)
... 41 more
0
  • 답변 42

  • 대전개발자커뮤니티
    887
    2013-05-31 17:26:32
    정확한 사항은 아니지만 혹시 아이바티스에 정의된 쿼리문 내용 중 <, >, = 과 같은 특수 문자가 들어가시나요? 만일 있다면 CDATA 처리는 하셨나요?
  • 대전개발자커뮤니티
    887
    2013-05-31 17:30:39
    해당 아이바티스 쿼리 정의 파일을 올려주세요.
  • 아라리요
    1k
    2013-05-31 17:30:45
    대전개발자커뮤니티님//댓글 달아주신거 보고 update 할때는 = 기호가 들어가서 CDATA 처리 했습니다.
    그러나 마찬가지입니다. ㅠㅠ
  • 아라리요
    1k
    2013-05-31 17:37:43
    대전개발자커뮤니티님//첨부했습니다.
  • 대전개발자커뮤니티
    887
    2013-05-31 17:44:03
    수정 쿼리문 실행하실 때 넘겨주는 인자로 AuthVO 객체에 정의되어 있는 것 같습니다.
    에러가 발생할 때 아이바티스 API 호출 전에 어떤 값들이 넘어가는지 찍어서 올려주세요.
  • akbory
    356
    2013-05-31 17:46:48
    jdbc url 설정 스트링도 부탁드려요. charset 때문인 듯도 싶네요.
  • 아라리요
    1k
    2013-05-31 17:49:15
    AuthVO 객체에서 userId랑 tradeName만 주었습니다. tradeName만 변경하도록 테스트 하였거든요. tradeName은 한글 아무거나 몇글자 적었습니다.
    그리고 jdbc url은 ?useUnicode=true&characterEncoding=UTF8&autoReconnect=true
    이렇게 적어주었습니다.
  • akbory
    356
    2013-05-31 17:49:22
    utf-8 로 바꾸신게 DB 설정을 그렇게 바꾸셨다는건가요?
    조회시에는 문제 없나요?
    화면/Java/DB 모두 log 를 넣었을때 해당 값이 이상이 있는 구간이 어디인가요?
  • akbory
    356
    2013-05-31 17:53:39
    MySQL 버전이 5.0/5.1 인가요?
  • 대전개발자커뮤니티
    887
    2013-05-31 17:55:56
    추상적으로 무슨 값이 넘어 간다는 것을 이야기 들으려고 하는게 아니구요
    실제 쿼리문 호출 전 넘어가는 인자(VO) 에 값이 어떤 형태로 있는지 찍어보시라는 이야기입니다.
    그리고 가능한 아이바티스 쿼리문을 작성하실 때 문장과 같이 removeFirstPrepend 속성을 true로 넣어주세요.

    다시 본론으로 넘어가서 실제 인자값을 올려주세요.
  • 대전개발자커뮤니티
    887
    2013-05-31 17:57:47

    UPDATE USER_INFO


    PASSWORD = PASSWORD(#password#)


    PERMISSION_CODE = #permissionCode#


    PERMISSION_VALID_DATE = #permissionValidDate#


    PERMISSION_START_DATE = #permissionStartDate#


    PAYMENT_COUNT = #paymentCount#


    IP_INFO = #ipInfo#


    MAC_INFO = #macInfo#


    TRADE_NAME = #tradeName#


    TEL_NUMBER = #telNumber#


    PHONE_NUMBER = #phoneNumber#


    PERMIT_NUMBER = #permitNumber#


    WHERE UNIQUE_CODE = MD5(#userId#)
  • 아라리요
    1k
    2013-05-31 18:00:29
    mysql에서 status로 봤을 때 character set을 모두 utf8로 되도록 바꿨습니다.
    해당 database도 utf8로 수정 했구요...
    debug로 봤는데 param으로 한글 제대로 들어가져 있습니다.

    SQLyog에서 한글을 입력하고 했을 시 데이터값이 입력은 되는데 ??? 이런식으로 들어가버리고 warning code:1366을 띄워주네요...
  • 대전개발자커뮤니티
    887
    2013-05-31 18:04:29
    아이바티스 API 호출 전 VO 들어간 값을 올려주세요.........................제발 있는 그대로 올려주세요.
    그리고 MySQL 상에 UNIQUE_CODE 에 들어가 있는 값이 SQLyog에서 조회하면 어떻게 나오는지도 올려주시구요.
  • 아라리요
    1k
    2013-05-31 18:06:34
    AuthVO [userId=smart, password=null, uniqueCode=null, permissionCode=null, permissionValidDate=null, permissionStartDate=null, paymentCount=0, ipInfo=null, macInfo=null, tradeName=폰폰폰, telNumber=null, phoneNumber=null, permitNumber=null, regiDate=null]
  • 대전개발자커뮤니티
    887
    2013-05-31 18:06:59
    그리고 한 가지 더 UNIQUE_CODE, TRADE_NAME 데이터 타입도 조회해보고 올려주세요.
  • 아라리요
    1k
    2013-05-31 18:07:43
    대전개발자커뮤니티님//unique_code값은 이상없이 조회 됩니다.
  • 아라리요
    1k
    2013-05-31 18:09:19
    db에서 unique_code랑 trade_name의 타입은 text로 했습니다.
  • 대전개발자커뮤니티
    887
    2013-05-31 18:09:46
    ^^;; 아래 사항을 올려주세요.
    1. UNIQUE_CODE 에 들어가 있는 값이 SQLyog 에서 조회하면 어떻게 나오는지도 올려주시구요.
    2. UNIQUE_CODE, TRADE_NAME 데이터 타입 올려주세요.
  • akbory
    356
    2013-05-31 18:11:56
    MySQL 버전좀.. ㅠㅜ
  • 아라리요
    1k
    2013-05-31 18:13:18
    1. 8c319f28d81d1527a9428e9a5c2195f5
    2. VO에서는 String으로 했고, db에서는 unique_code는 tinytext, trade_name은 text 입니다.
  • 아라리요
    1k
    2013-05-31 18:13:34
    MySQL 5.1 입니다.
  • 대전개발자커뮤니티
    887
    2013-05-31 18:21:38
    아래 사항을 확인해봐주세요.
    1. 아이바티스 쿼리문에 removeFirstPrepend="true" 을 지정하세요.
    2. SQL 실행 프로그램을 이용해서 아래 쿼리문을 실행해보시고 결과를 올려주세요.
    SELECT TRADE_NAME, UNIQUE_CODE
    FROM USER_INFO
    WHERE UNIQUE_CODE = '8c319f28d81d1527a9428e9a5c2195f5'
  • 아라리요
    1k
    2013-05-31 18:22:55
    대전개발자커뮤니티님//말씀하신대로 removeFirstPrepend="true" 지정했습니다.
    그리고 쿼리 실행했는데 역시나 같은 오류 발생하고
    SQL 프로그램에서
    SELECT TRADE_NAME, UNIQUE_CODE
    FROM USER_INFO
    WHERE UNIQUE_CODE = '8c319f28d81d1527a9428e9a5c2195f5'
    이렇게 쿼리 날렸을 때
    TRADE_NAME | UNIQUE_CODE
    NULL | 8c319f28d81d1527a9428e9a5c2195f5
    이렇게 나옵니다.
  • akbory
    356
    2013-05-31 18:23:43
    show create table USER_INFO;
    show variables like 'char%';
    요거 두개 실행하고 결과값 붙여 주시겠어요?
  • 아라리요
    1k
    2013-05-31 18:26:28

    mysql> show create table user_info;
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ----+
    | Table | Create Table


    |
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ----+
    | user_info | CREATE TABLE `user_info` (
    `index` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'user index',
    `user_id` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user id',
    `password` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user password',
    `unique_code` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user unique code',
    `permission_code` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user permission code',
    `permission_valid_date` datetime DEFAULT NULL COMMENT 'valid date of permission',
    `permission_start_date` datetime DEFAULT NULL COMMENT 'start date of permission',
    `payment_count` int(11) DEFAULT NULL COMMENT 'count of paymnet',
    `ip_info` tinytext CHARACTER SET latin1 COMMENT 'ip info',
    `mac_info` text CHARACTER SET latin1 COMMENT 'mac info',
    `trade_name` text CHARACTER SET latin1 COMMENT 'trade name',
    `tel_number` text CHARACTER SET latin1 NOT NULL COMMENT 'tel number',
    `phone_number` text CHARACTER SET latin1 NOT NULL COMMENT 'phone number',
    `permit_number` text CHARACTER SET latin1 COMMENT 'permit number',
    `regi_date` datetime NOT NULL COMMENT 'registration date',
    PRIMARY KEY (`index`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=euckr |
    +-----------+-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
    ----+
    1 row in set (0.00 sec)

    mysql> show variables like 'char%';
    +--------------------------+---------------------------------------------------------+
    | Variable_name | Value |
    +--------------------------+---------------------------------------------------------+
    | character_set_client | utf8 |
    | character_set_connection | utf8 |
    | character_set_database | utf8 |
    | character_set_filesystem | binary |
    | character_set_results | utf8 |
    | character_set_server | utf8 |
    | character_set_system | utf8 |
    | character_sets_dir | C:\Program Files\MySQL\MySQL Server 5.1\share\charsets\ |
    +--------------------------+---------------------------------------------------------+
    8 rows in set (0.00 sec)
  • akbory
    356
    2013-05-31 18:27:11
    DEFAULT CHARSET=euckr 요게 문제인듯 하네요. 해당 테이블 다시 만들어 보세요~
  • akbory
    356
    2013-05-31 18:27:37
    아! DEFAULT CHARSET=utf8 붙여서..
  • 아라리요
    1k
    2013-05-31 18:28:50
    DEFAULT CHARSET=utf8로 변경은 했습니다... euckr 했을때도 안되고 utf8로 해도 안되더라고요
  • akbory
    356
    2013-05-31 18:30:07
    테이블을 다시 만들어 보셨다는 이야기시죠?

    CREATE TABLE `user_info` (
    ......
    PRIMARY KEY (`index`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=euckr
    -> DEFAULT CHARSET=euckr 이부분을 ?
  • 대전개발자커뮤니티
    887
    2013-05-31 18:30:29
    아래와 같은 쿼리를 두 번 실행하시고 조회된 값을 올려주세요. 아마도 동일한 값이 안 나올 것 같은데요.
    SELECT MD5('smart')
    FROM USER_INFO
  • 아라리요
    1k
    2013-05-31 18:31:52
    보리님// 테이블을 새로 만들지는 않았습니다. 설정값만 바꿨는데... 다시 만들어보는거랑 다른가요?
    대전개발자커뮤니티님//똑같은 값이 나옵니다. 8c319f28d81d1527a9428e9a5c2195f5
  • akbory
    356
    2013-05-31 18:32:32
    붙여주신 내용만 보면 테이블은 euckr 상태에서 만들어졌고, 설정은 그후 변경하셔서 utf8 이 된듯 한데요~
  • akbory
    356
    2013-05-31 18:33:08
    네.. 테이블이 만들어질 당시의 charset 을 따라가요..
  • 대전개발자커뮤니티
    887
    2013-05-31 18:34:41
    네이트온 계정 붙어서 볼 수 있을까요? 가능하시다면 계정을 올려주시겠어요.
  • akbory
    356
    2013-05-31 18:34:51
    기존 테이블 데이터가 중요하다면
    테이블명만 바꿔서
    CREATE TABLE `user_info_test` (
    ......
    PRIMARY KEY (`index`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8
    요렇게 하고 xml 설정에서 타겟만 바꿔서 다시 한번 해보세요.
  • 아라리요
    1k
    2013-05-31 18:38:13
    대전개발자커뮤니티님//회사라서 네이트온은 힘들구요...
    보리님//말씀하신대로 drop table 시킨 후에 새로 만들어봤는데 안되네요 ㅎ;;
  • 대전개발자커뮤니티
    887
    2013-05-31 18:44:35
    이젠 실제 환경에 접속해봐야 알아 낼 수 있을 것 같습니다.
  • akbory
    356
    2013-05-31 18:46:33
    크게 관계는 없긴한데 참고하시고,
    http://dev.mysql.com/doc/refman/5.5/en/charset-unicode.html
    http://bugs.mysql.com/bug.php?id=30131
    전, 약속이 있어서.. 이만.. ㅜㅠ (해결 못하니 도망 가는듯..)
    도움 못되어 드려서 죄송합니다..
    그럼 수고들 하시고 좋은 주말 되세요~
  • 아라리요
    1k
    2013-05-31 18:55:24
    대전개발자커뮤니티님, 보리님// 바쁘실텐데도 도움 주셔서 감사합니다.
    아무래도 저도 이젠 퇴근할 시간이... 그냥 주말 푹 쉬고 담주에 와서 지금 쓰는 db를 지우고 새로 만들어봐야겠네요. ㅠㅠ
    감사했습니다. 좋은 주말 보내세요~
  • 아라리요
    1k
    2013-05-31 19:14:29
    와아... 해결했네요... db에 타입이 text니까 안되고... varchar 하니까 되네요 =ㅅ=;
    뭐 이런.... 아오~ 이걸로 오늘 하루 다 잡아먹었네...
  • youtome
    232
    2013-06-01 18:44:34
    varchar니 text가 문제가 아니라 중간에 CHARACTER SET latin1 으로 모든 필드들이 지정되어 있는게 문제네요. 그냥 CHARACTER SET 없으면 테이블 기본값을 따라가는데 latin1으로 되어 있어서 그런것 같습니다.
    CREATE TABLE `user_info` (
    `index` bigint(20) NOT NULL AUTO_INCREMENT COMMENT 'user index',
    `user_id` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user id',
    `password` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user password',
    `unique_code` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user unique code',
    `permission_code` tinytext CHARACTER SET latin1 NOT NULL COMMENT 'user permission code',
    `permission_valid_date` datetime DEFAULT NULL COMMENT 'valid date of permission',
    `permission_start_date` datetime DEFAULT NULL COMMENT 'start date of permission',
    `payment_count` int(11) DEFAULT NULL COMMENT 'count of paymnet',
    `ip_info` tinytext CHARACTER SET latin1 COMMENT 'ip info',
    `mac_info` text CHARACTER SET latin1 COMMENT 'mac info',
    `trade_name` text CHARACTER SET latin1 COMMENT 'trade name',
    `tel_number` text CHARACTER SET latin1 NOT NULL COMMENT 'tel number',
    `phone_number` text CHARACTER SET latin1 NOT NULL COMMENT 'phone number',
    `permit_number` text CHARACTER SET latin1 COMMENT 'permit number',
    `regi_date` datetime NOT NULL COMMENT 'registration date',
    PRIMARY KEY (`index`)
    ) ENGINE=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=euckr |
  • 아라리요
    1k
    2013-06-01 20:47:07
    개발자님//일단은 varchar로 해결은 했긴 했습니다. 그런데 웃긴데 my.ini 파일 들어가서 euckr로 다 설정하고... 그러고서 db 생성해서 테이블 만들었는데도 latin1로 되어 있네요... 뭐지...
  • 로그인을 하시면 답변을 등록할 수 있습니다.