AWS의 RDS 서비스 이용 시, MySQL에서 아래와 같이 function 을 만든 경우 한글이 깨지는 경우가 종종 있다.
물론, ParameterGroup 의 모든 character-set을 UTF8 로 지정한 경우에도..
character_set_database 의 값이 utf8 이 아닌 latin1 으로 되어있는 경우일것이다.
이것은 파라미터 그룹을 변경해서 적용해도 바뀌지 않는다. (현재까지는..)
/* 코드명 조회 */
DROP FUNCTION IF EXISTS aaa.GET_CODE_NAME;
CREATE FUNCTION aaa.GET_CODE_NAME(cdType VARCHAR(4), cdValue VARCHAR(4)) RETURNS VARCHAR(100) CHARSET UTF8
BEGIN
DECLARE codeName VARCHAR(100) CHARSET UTF8;
SET codeName = (
SELECT NAME FROM CODES WHERE TYPE = cdType AND CODE = cdValue
);
RETURN codeName;
END;
위와 같이 리턴타입 및 리턴에 쓰이는 변수들의 캐릭터셋도 지정해줘야 한글이 깨지는것을 방지할 수 있다.
출처: http://blog.jidolstar.com/867
2014년 9월 26일 금요일
2013년 9월 30일 월요일
[MySQL]SNS의 시간/날짜 표현 방법
몇 분 전, 몇 시간 전, 몇 일 전 등의 표현은 아래처럼..
SELECT
CASE
WHEN NOW() < DATE_ADD(regDate, INTERVAL 1 HOUR) THEN CONCAT(TIMESTAMPDIFF(MINUTE, regDate, NOW()), '분 전')
WHEN NOW() < DATE_ADD(regDate, INTERVAL 24 HOUR) THEN CONCAT(TIMESTAMPDIFF(HOUR, regDate, NOW()), '시간 전')
WHEN NOW() < DATE_ADD(regDate, INTERVAL 7 DAY) THEN CONCAT(CONCAT(TIMESTAMPDIFF(DAY, regDate, NOW()), '일 전 '), DATE_FORMAT(GET_PARALLAX(regDate, 9), '%l:%i %p'))
ELSE DATE_FORMAT(GET_PARALLAX(regDate, parallax), '%c월 %e일 %l:%i')
END
당연히 regDate는 DATETIME형식의 컬럼이어야 함.
GET_PARALLAX는 시차(표준시간대)관련 커스텀 펑션이므로 여기서는 제외하여야 함..
SELECT
CASE
WHEN NOW() < DATE_ADD(regDate, INTERVAL 1 HOUR) THEN CONCAT(TIMESTAMPDIFF(MINUTE, regDate, NOW()), '분 전')
WHEN NOW() < DATE_ADD(regDate, INTERVAL 24 HOUR) THEN CONCAT(TIMESTAMPDIFF(HOUR, regDate, NOW()), '시간 전')
WHEN NOW() < DATE_ADD(regDate, INTERVAL 7 DAY) THEN CONCAT(CONCAT(TIMESTAMPDIFF(DAY, regDate, NOW()), '일 전 '), DATE_FORMAT(GET_PARALLAX(regDate, 9), '%l:%i %p'))
ELSE DATE_FORMAT(GET_PARALLAX(regDate, parallax), '%c월 %e일 %l:%i')
END
당연히 regDate는 DATETIME형식의 컬럼이어야 함.
GET_PARALLAX는 시차(표준시간대)관련 커스텀 펑션이므로 여기서는 제외하여야 함..
2013년 9월 23일 월요일
아마존 RDS 이용 시 function 생성 오류날 때
아마존의 RDS 이용 시 function을 생성하려고 하면 오류가 발생한다.
mysql> show global variables like 'log_bin_trust_function_creators';
위 처럼 확인해보면, OFF 로 되어있는데.. 이것을 아래처럼 수정하면 ON 으로 바뀐다.
그런데 아마존 RDS에서는 super 권한문제로 변경되지 않는다.
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
/* 권한문제로 안될때는 파라미터그룹 log_bin_trust_function_creators 수정 */
이럴때는 Parameter Groups 에서 log_bin_trust_function_creators 항목을 찾아 값을 1로 세팅해주면 된다.
참고로, RDS 에서 UTF-8을 사용하는 방법또한, 파라미터 그룹을 수정하면 된다.
character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = utf8
character_set_results = utf8
character_set_server = utf8
collation_connection = utf8_general_ci
이렇게 한 후, 각 데이터베이스 및 테이블, Function 생성 시 캐릭터셋을 UTF8로 지정하면 된다.
mysql> show global variables like 'log_bin_trust_function_creators';
위 처럼 확인해보면, OFF 로 되어있는데.. 이것을 아래처럼 수정하면 ON 으로 바뀐다.
그런데 아마존 RDS에서는 super 권한문제로 변경되지 않는다.
mysql> SET GLOBAL log_bin_trust_function_creators = 1;
/* 권한문제로 안될때는 파라미터그룹 log_bin_trust_function_creators 수정 */
이럴때는 Parameter Groups 에서 log_bin_trust_function_creators 항목을 찾아 값을 1로 세팅해주면 된다.
참고로, RDS 에서 UTF-8을 사용하는 방법또한, 파라미터 그룹을 수정하면 된다.
character_set_client = utf8
character_set_connection = utf8
character_set_database = utf8
character_set_filesystem = utf8
character_set_results = utf8
character_set_server = utf8
collation_connection = utf8_general_ci
이렇게 한 후, 각 데이터베이스 및 테이블, Function 생성 시 캐릭터셋을 UTF8로 지정하면 된다.
2011년 5월 23일 월요일
Oracle, MySQL, MSSQL 의 페이지처리 쿼리 예제
정렬조건 : aa 컬럼 DESC
검색어 : bb컬럼중 특정단어
목록수 : 10~20 까지
[ORACLE] ROWNUM 을 이용한다.
SELECT aa, bb, cc, dd FROM
(SELECT aa, bb, cc, dd, ROWNUM rnum FROM
(SELECT aa, bb, cc, dd, ROWNUM rnum FROM 테이블명 ORDER BY aa DESC)
WHERE bb LIKE '%검색어%')
WHERE rnum >= 10 AND rnum <= 20
[MySQL] LIMIT 를 이용한다.
SELECT aa, bb, cc, dd FROM 테이블명
WHERE bb LIKE '%검색어%'
ORDER BY aa DESC LIMIT 10, 20
[MSSQL] TOP 을 이용한다.
SELECT * FROM
(SELECT TOP 10 aa, bb, cc, dd FROM
(SELECT TOP 20 aa, bb, cc, dd FROM
WHERE bb LIKE '%검색어%'
테이블명 ORDER BY aa DESC)
DERIVEDTBL ORDER BY aa)
DERIVEDTBL ORDER BY aa DESC
*MSSQL에서 주의할 점은 10은 목록수이고, 20은 목록수 * 현재페이지로 산출된다.
검색어 : bb컬럼중 특정단어
목록수 : 10~20 까지
[ORACLE] ROWNUM 을 이용한다.
SELECT aa, bb, cc, dd FROM
(SELECT aa, bb, cc, dd, ROWNUM rnum FROM
(SELECT aa, bb, cc, dd, ROWNUM rnum FROM 테이블명 ORDER BY aa DESC)
WHERE bb LIKE '%검색어%')
WHERE rnum >= 10 AND rnum <= 20
[MySQL] LIMIT 를 이용한다.
SELECT aa, bb, cc, dd FROM 테이블명
WHERE bb LIKE '%검색어%'
ORDER BY aa DESC LIMIT 10, 20
[MSSQL] TOP 을 이용한다.
SELECT * FROM
(SELECT TOP 10 aa, bb, cc, dd FROM
(SELECT TOP 20 aa, bb, cc, dd FROM
WHERE bb LIKE '%검색어%'
테이블명 ORDER BY aa DESC)
DERIVEDTBL ORDER BY aa)
DERIVEDTBL ORDER BY aa DESC
*MSSQL에서 주의할 점은 10은 목록수이고, 20은 목록수 * 현재페이지로 산출된다.
피드 구독하기:
글 (Atom)