Backend/Database 6

PostgreSQL - pgcrypto 모듈을 사용한 패스워드 및 문자열 암호화

PostgreSQL에서는 pgcrypto 모듈에서 패스워드 암호화를 위한 함수인 crypto()와 gen_salt(n)를 제공한다 crypto() 함수는 해시 작업, gen_salt() 함수는 솔트값을 생성할 암호화 알고리즘을 지정하는 함수이다. 해당 함수로 만든 패스워드는 복호화가 불가하다. 따라서 나중에 패스워드 검증을 위해서는 복호화가 아닌 암호화를 한 후 비교해야 한다는 특징이 있다. crypto 함수에서 제공하는 암호화 알고리즘은 다음과 같다. 알고리즘 평문 최대 길이 salt 길이 출력 길이 비고 bf 72 128 60 Blowfish md5 X 48 34 MD5 des 8 12 13 UNIX의 암호화 방식 xdes 8 24 20 확장 DES 이제 사용법을 알아보자! 아래 쿼리를 사용하여 pg..

Backend/Database 2021.12.03

Database - ORDER BY 커스텀 정렬

보통 ORDER BY 절에는 컬럼명 + [ASC | DESC] 형태로 정렬하고자 하는 기준 컬럼을 넣어서 사용한다. 기준 컬럼명만 넣어줄 경우(ORDER BY 컬럼명), 기본적으로 오름차순(ASC)으로 정렬된다. 혹은, 행 번호나 컬럼을 이용한 계산식 혹은 함수를 이용하여 정렬을 할 수도 있다. 계산식이나 함수 사용 예시는 다음과 같다. order by LENGTH(CITY_CONT) --해당 컬럼 길이 기준 오름차순 정렬 order by VAL1/VAL2 -- 수식으로 정렬 order by rand() -- 랜덤 정렬(mysql) order by 2, 1 -- 컬럼명 대신 SELECT 절에서 선택된 컬럼의 위치번호로 지정 가능 order by CITY_NAME LIKE '서%', CITY_NAME LI..

Backend/Database 2021.09.14

Database - 문자열 포함 여부

MySQL/MsSQL/Oracle INSTR(컬럼명, '문자열') 문자열 대/소문자 구분은 안된다. 그리고 PostgreSQL의 경우에는 instr() 함수를 제공하지 않는다. 그렇기 때문에 위 방법 외에 LIKE 구문을 쓰거나 POSITION() 등의 인덱스 찾기 함수를 써서 하는 방법을 사용해야 한다. (물론 다른 DB에서도 마찬가지다.) SELECT * FROM 테이블명 WHERE POSITION('문자열' in 컬럼명) > 0 // 해당 문자열을 포함하지 않으면 0 반환

Backend/Database 2021.05.16

Database - 날짜 포맷팅

프로그래머스 SQL 문제를 풀다가 날짜 포맷팅 문제가 나왔다. 요새 PostgreSQL만 쓰다보니 MySQL 문법을 다 까먹어서 날짜 포맷팅 관련해서 정리해보려고 한다. MySQL DATE_FORMAT(날짜, '포맷') DATE_FORMAT() 함수를 사용한다. 아래 표에 자주 쓰이는 포맷 종류를 정리했다. 포맷 설명 %Y 년도(4자리) %y 년도(2자리) %c 월 %d 일(2자리) %e 일(1자리) %H 시(24시 기준, 00~23) %h 시(12시 기준, 01~12) %i 분 %s, %S 초 %T hh:mm:ss Oracle/PostgreSQL // 날짜에서 원하는 부분만 추출할 때 주로 사용 TO_CHAR(날짜, '포맷') // 문자열 타입의 컬럼을 날짜 타입으로 변환할 때 사용 TO_DATE(날짜..

Backend/Database 2021.05.16

PostgreSQL - 현재 시퀀스 값 변경

현재 생성된 시퀀스의 값을 변경하는 쿼리는 2가지 방식이 있다. 1. ALTER문 이용 ALTER SEQUENCE 시퀀스명 restart with 시퀀스값; 2. SELECT문 이용 select setval('시퀀스명', 시퀀스값); // default: true, 지정한 시퀀스 다음 값부터 실행 select setval('시퀀스명', 시퀀스값, false); // 지정한 시퀀스값부터 실행 그 외에 시퀀스와 관련된 SQL문을 아래에 정리했다. 3. 시퀀스 생성 CREATE SEQUENCE 시퀀스명 4. 현재 시퀀스값 조회 SELECT currval('시퀀스명') 혹은 SELECT last_value FROM 시퀀스명 5. 다음 시퀀스값 조회 SELECT nextval('시퀀스명')

Backend/Database 2021.05.03