๐Ÿค– Backend/SpringBoot

java.sql.SQLException: Incorrect string value

sckwon770 2024. 2. 25. 20:21

 

์ด์ „ ๋…ธ์…˜ ๋ธ”๋กœ๊ทธ์˜ java.sql.SQLException: Incorrect string value (2021.03.28)๋กœ๋ถ€ํ„ฐ ๋งˆ์ด๊ทธ๋ ˆ์ด์…˜๋œ ๊ธ€์ž…๋‹ˆ๋‹ค.

 

 

java.sql.SQLException: Incorrect string value: '\xEC\xB0\xBD\xEC\xB0\xBD...' for column `mm_server`.`restaurant`.`name` at row 1
Query is: insert into restaurant (deliveryable, description, location, name, price, type) values (?, ?, ?, ?, ?, ?), parameters [0,<null>,3,'์ฐฝ์ฐฝ๊ตญ๋ฐฅ',0,0]
java thread: http-nio-8080-exec-1
        at org.mariadb.jdbc.internal.util.LogQueryTool.exceptionWithQuery(LogQueryTool.java:163) ~[mariadb-java-client-2.3.0.jar!/:na]
        at org.mariadb.jdbc.internal.protocol.AbstractQueryProtocol.executeQuery(AbstractQueryProtocol.java:280) ~[mariadb-java-client-2.3.0.jar!/:na]
        at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeInternal(MariaDbPreparedStatementClient.java:223) ~[mariadb-java-client-2.3.0.jar!/:na]
        at org.mariadb.jdbc.MariaDbPreparedStatementClient.execute(MariaDbPreparedStatementClient.java:159) ~[mariadb-java-client-2.3.0.jar!/:na]
        at org.mariadb.jdbc.MariaDbPreparedStatementClient.executeUpdate(MariaDbPreparedStatementClient.java:194) ~[mariadb-java-client-2.3.0.jar!/:na]
        at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeUpdate(ProxyPreparedStatement.java:61) ~[HikariCP-3.2.0.jar!/:na]
        at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeUpdate(HikariProxyPreparedStatement.java) ~[HikariCP-3.2.0.jar!/:na]
        at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.executeUpdate(ResultSetReturnImpl.java:175) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.dialect.identity.GetGeneratedKeysDelegate.executeAndExtract(GetGeneratedKeysDelegate.java:57) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:42) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3090) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.persister.entity.AbstractEntityPersister.insert(AbstractEntityPersister.java:3683) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.action.internal.EntityIdentityInsertAction.execute(EntityIdentityInsertAction.java:81) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:645) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.engine.spi.ActionQueue.addResolvedEntityInsertAction(ActionQueue.java:282) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.engine.spi.ActionQueue.addInsertAction(ActionQueue.java:263) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.engine.spi.ActionQueue.addAction(ActionQueue.java:317) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.addInsertAction(AbstractSaveEventListener.java:332) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.performSaveOrReplicate(AbstractSaveEventListener.java:289) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.performSave(AbstractSaveEventListener.java:196) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.event.internal.AbstractSaveEventListener.saveWithGeneratedId(AbstractSaveEventListener.java:127) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.event.internal.DefaultPersistEventListener.entityIsTransient(DefaultPersistEventListener.java:192) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
        at org.hibernate.event.internal.DefaultPersistEventListener.onPersist(DefaultPersistEventListener.java:135) ~[hibernate-core-5.3.12.Final.jar!/:5.3.12.Final]
"nohup.out" 578L, 77618C

 

๋ฌธ์ œ ์›์ธ

์„œ๋ฒ„๋กœ ๋ฐ์ดํ„ฐ๋ฅผ ์ถ”๊ฐ€ํ•˜๋Š” ์š”์ฒญ์„ ๋ณด๋ƒˆ์„ ๋•Œ ๋ฐœ์ƒํ–ˆ๋‹ค. java.sql.SQLException: Incorrect string value: ์—์„œ ์•Œ ์ˆ˜ ์žˆ๋“ฏ์ด ์ž˜๋ชป๋œ ๋ฌธ์ž์—ด ๊ฐ’ ๋•Œ๋ฌธ์— ๋ฐœ์ƒํ•˜์˜€๋Š”๋ฐ, ์›์ธ์€ ์ธ์ฝ”๋”ฉ์˜ ๋ฌธ์ œ์˜€๋‹ค.

 

ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•

๋กœ๊ทธ์—์„œ ๋ณผ ์ˆ˜ ์žˆ๋“ฏ์ด restaurant ํ…Œ์ด๋ธ”์˜ name ์ปฌ๋Ÿผ์— '์ฐฝ์ฐฝ๊ตญ๋ฐฅ' ์ด๋ผ๋Š” ํ•œ๊ธ€ ๋ฐ์ดํ„ฐ๋ฅผ ๋ณด๋ƒˆ์ง€๋งŒ ์˜ค๋ฅ˜๊ฐ€ ๋ฐœ์ƒํ–ˆ๋‹ค. ์ด๋Š” DB์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹ ๋ฌธ์ œ์ธ๋ฐ, RDS์˜ ๊ธฐ๋ณธ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์€ latin-1 ์ด๋‹ค. ๋”ฐ๋ผ์„œ ํŒŒ๋ผ๋ฏธํ„ฐ ๊ทธ๋ฃน์„ ํ†ตํ•ด์„œ utf8, utf8mb4, utf8mb4_unicode_ci ๋กœ ๋ณ€๊ฒฝํ•ด์ค๋‹ˆ๋‹ค.

 

๐Ÿ“Œ `show variables like 'c%';` ๋ฅผ ํ†ตํ•ด db์˜ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์„ ํ™•์ธํ–ˆ๋”๋‹ˆ utf8mb4๊ฐ€ ์•„๋‹ˆ๋ผ utf8์ธ ๋ถ€๋ถ„์ด ์žˆ์„ ์ˆ˜ ์žˆ๋Š”๋ฐ, ์ด๋Š” ํฐ ๋ฌธ์ œ๊ฐ€ ์•„๋‹ˆ๋‹ˆ ๋„˜์–ด๊ฐ€๋„ ๋œ๋‹ค.

 

ํ˜น์‹œ ๊ทธ๋ž˜๋„ ํ•ด๊ฒฐ๋˜์ง€ ์•Š๋Š”๋‹ค๋ฉด??

์ด๋Š” ์ด๋ฏธ ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์ด ๋ณ€๊ฒฝ์ „ ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹์œผ๋กœ ์ƒ์„ฑ๋˜์—ˆ๊ธฐ ๋•Œ๋ฌธ์ผ ๊ฒƒ์ด๋‹ค.

 

  • ์ƒ์„ฑ๋œ ํ…Œ์ด๋ธ”์˜ ์ •๋ณด ํ™•์ธ (ํ…Œ์ด๋ธ” ์ •๋ณด ์ œ์ผ ๋ฐ‘์— DEFAULT CHARSET์ด ์ธ์ฝ”๋”ฉ ๋ฐฉ์‹)
SHOW CREATE TABLE table_name;

 

  • utf8 ๋กœ ํ…Œ์ด๋ธ”์˜ ์ธ์ฝ”๋”ฉ์„ ๋ณ€๊ฒฝ
ALTER TABLE table_name CONVERT TO character SET utf8;

 

ํ•ด๊ฒฐ!