org.springframework.orm.jpa.JpaSystemException: could not execute statement; nested exception is org.hibernate.exception.GenericJDBCException: could not execute statement
...
Caused by: java.sql.SQLException: Incorrect string value: '\xEA\xB2\x8C\xEC\x8B\x9C...' for column 'title' at row 1
라는 에러가 발생하여 당황했는데
알고보니 인코딩이 안맞아 발생한 문제였다.
JPA에서는 UTF-8을 사용하였지만 MySql에는 EUCKR로 지정되었다.
1. 먼저 Mysql의 현재 인코딩 방식을 조회해본다.
mysql> show variables like 'c%';
2. Client 인코딩 변경
mysql> set names utf8;
3. DB 인코딩 변경
mysql> ALTER DATABASE [스키마 이름] default character set utf8;
다시 인코딩을 조회해보면 변경된 것을 확인할 수 있다.
변경되지 않았다면 윈도우 서비스에서 MySQL을 재시작해보자.
다른 방법으로는 my.ini 파일을 메모장으로 수정하는 것인데
메모장으로 설정을 건드리는 짓이라 별로 좋은 것 같지 않다. (실제로 시도해보다가 서비스 실행이 안됨..)
-- 별찍기 버전 1
SELECT RNUM SEQ
,LPAD('*',RNUM,'*')T1
,LPAD('A',RNUM,'B')T2
,DECODE(SIGN(RNUM-5),1,6-((RNUM-4)),RNUM) AS DSEQ
,LPAD('*',DECODE(SIGN(RNUM-5),1,6-((RNUM-4)),RNUM),'*') DFTST
,CASE WHEN RNUM -5 >= 1 THEN 6-((RNUM-4))
ELSE RNUM
END AS CSEQ
,LPAD('*',CASE WHEN RNUM -5 >= 1 THEN 6-((RNUM-4))
ELSE RNUM
END
,'*') CFTST
FROM(SELECT ROWNUM RNUM
FROM USER_TAB_COLUMNS
WHERE ROWNUM < 10
ORDER BY RNUM ASC
--ORDER BY RNUM DESC
);
SELECT RPAD('A',3,'BCDEFGHIZKLMNOPQRSTUVWXYZ') FROM DUAL;
대표사진 삭제
오른쪽 정렬오른쪽 정렬왼쪽 정렬왼쪽 정렬가운데 정렬가운데 정렬
사진 편집
작게작게문서 너비문서 너비옆트임옆트임
삭제삭제
실행결과
-- 별찍기 버전 2
SELECT RNUM SEQ
,LPAD('*',RNUM,'*') T1
,LPAD('A',RNUM,'B') T2
,DECODE(SIGN(RNUM -10),1,11-((RNUM-9)),RNUM) AS DSEQ
,LPAD('*',DECODE(SIGN(RNUM-10),1,11-((RNUM-9)),RNUM),'*') DFTST
,CASE WHEN RNUM -10 >= 1 THEN 11-((RNUM-9))
ELSE RNUM
END AS CSEQ
,LPAD('*',CASE WHEN RNUM -10 >= 1 THEN 11-((RNUM-9))
ELSE RNUM
END
,'*') CFTST
FROM(SELECT ROWNUM RNUM
FROM USER_TAB_COLUMNS
WHERE ROWNUM < 20
ORDER BY RNUM ASC
);
저장 함수는결과를 보기(SELECT) 위한 작업의 단위이다. 개념은 다르지만 사용하는 방법은 PL / SQL 이므로
상당히 유사하다.
저장 함수에 대해 정리하기 위해 전과 마찬가지로 HUMAN, CAR 테이블을 사용한다.
1. 저장 함수 생성 / 삭제하기
전과 마찬가지로 CREATE 를 통해 함수를 생성할 수 있다.
CREATE OR REPLACE FUNCTION SEL_HUMAN
(
V_NAME IN HUMAN.H_NAME % TYPE
)
RETURN HUMAN.H_NAME % TYPE
IS
V_NUM HUMAN.H_NO % TYPE;
BEGIN
SELECT H_NO INTO V_NUM
FROM HUMAN
WHERE H_NAME = V_NAME;
RETURN V_NUM;
END;
/
이번에 주목할 점은 프로시저에서 언급하지 않은 IS 부분이다.
IS 영역은 내부에서 사용할 지역 변수를 선언하는 영역이다. 따라서 V_NUM 은 HUMAN 테이블의 H_NO와 같이
NUMBER형으로 선언된 지역변수이다.
BEGIN의 쿼리를 보면 V_NAME 변수의 값과 사람의 이름이 같으면 H_NO 의 값을 V_NUM에 넣어 리턴을 한다.
여기서 리턴은 함수의 결과를 반환해주는 역활을 한다. 자바에서 사용한 RETURN과 동일하다.