본문 바로가기
  • 포르쉐타고싶다

MySQL15

[MySQL] RDS에 서버를 둔 MySQL의 Default Charset를 utf8로 설정하기 1. 배경 필자는 MySQL을 Workbench를 이용해서 관리한다. 관리를 하면서 procedure나 trigger를 사용할 때 utf-8의 문자가 들어가는 상황들이 생기면 한글대신 ?가 들어가는 등 여러 문제가 생겨 결국 일일이 ~~~charset utf8 를 뒤에 붙여줘야 한다. 물론 default charset으로 utf8로 설정하는 방법이 있다. My.ini 나 My.cnf를 찾아서 해당 프로퍼티를 추가해주는 방식이 있다. 그러나 이는 나에게 먹히지 않는다. 2. 개념 RDS로 MySQL 서버를 빌려서 운영하는 경우는 내 컴퓨터의 My.ini를 고친다고해서 설정되지 않는다. RDS안에서 해결방법을 찾아야한다!! 3. 해결 방법 RDS의 파라미터 그룹에서 해당하는 파라미터의 파라미터 편집으로 들어.. 2020. 5. 25.
[MySQL] Forward Engineering 하는 도중 에러 해결 1. 배경 데이터베이스 서버를 옮기려고 기존 데이터베이스의 erd를 따서 새로운 MySQL서버에 Forward Engineering 을 하는데 자꾸 Executing SQL script in server ERROR: Error 1064: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'VISIBLE, CONSTRAINT `fk_Compras_Personas` FOREIGN KEY (`p 라고하는 에러가 생겨 진행을 못하고 있었다. 2. 개념 위의 ERROR: Error 1064: You have an error i.. 2020. 5. 25.
[MySQL] INSERT할 때 배열을 INSERT하는 방법 1. 배경 쿼리문을 짜다보면 개수가 정해지지 않은 배열을 INSERT해야 할 일이 생긴다. 만약 개수가 정해진 배열이면 INSERT INTO [TABLE] (COLUMN1, COLUMN2) VALUES (VALUE11, VALUE21), (VALUE12, VALUE22), (VALUE13, VALUE23) 이렇게 나열해서 insert할 수 있다. 하지만 개수가 정해지지 않은 객체배열은 어떻게 INSERT해야할까 서버에서 INSERT CONNECTION 쿼리문에 for문을 돌려서 '조진다'? LOOP PROCEDURE을 사용해야 할까? 2. 개념 방법은 쉬웠다. 1) 위에서 VALUES 뒤에 괄호를 넣어주지 않고 2) ?를 넣은 쿼리문을 connection_query에 넣어주고 3) ?에 대한 값으로 이중.. 2020. 5. 4.
[mysql] mysql과 excel 연동하기 : mysql for excel 1. 배경 엑셀로 되어있는 데이터 파일을 곧바로 mysql에 연동할 수 있다. 반대로, mysql에 있는 데이터베이스를 엑셀로 옮길 수 있다. 그 방법을 소개하겠다. 2. 구현 절차 0) mysql for excel을 설치한다.(설치가 되어있지 않은 사람에 한해서) 1) mysql로부터 테이블 구조를 가져온다. 2) 테이블 구조에 맞게 엑셀에서 데이터를 추가한다. 3) 데이터들이 추가된 엑셀파일을 mysql에 export(append)한다 3. 구현 방법 0) mysql for excel을 설치한다. - https://dev.mysql.com/downloads/windows/excel/ 여기서 설치할 수 있다. 1) mysql로부터 테이블 구조를 가져온다. - mysql for excel을 설치하면 아래.. 2020. 4. 26.
[mysql] INSERT - 중복되는 데이터는 넣지 않기 1. 배경 어떤 테이블은 데이터가 중복으로 들어가면 안되는 항목을 갖고있다. 예를 들어, 어떤 게시물의 [좋아요] 데이터를 갖고있는 테이블은 게시물_idx 유저_idx 조합의 칼럼을 갖고있고 로직을 간단하게 생각해보면 저 조합이 중복으로 들어가면 안된다는 것을 알 수 있다. (통신오류로 좋아요를 여러번 눌렀는데 제대로 취소되지 않고 중복으로 좋아요 데이터가 들어가게되면 나중에 유저가 나중에 좋아요를 취소했는데 좋아요 기록이 아직 남아있는 오류 발생) 그렇다면 애초에 중 {게시물_idx, 유저_idx}의 조합이 중복으로 insert되는 것을 미연에 방지해야 한다. 2. 개념 크게 두가지의 방법이 있다 1) 매 쿼리문에서 방지 ->where not exists 2) 컬럼 속성 설정을 통해 방지 -> (1) .. 2020. 4. 24.
[mysql] procedure의 인자로 배열 전달 : FIND_IN_SET 1. 배경 데이터베이스와 통신을 하면서 복잡한 쿼리문은 procedure을 이용해서 보다 효율적인 네트워킹할 수 있다. 프로시저에는 인자를 담을 수 있어 같은 내용의 프로시저에 변수만 다른 경우 상황에 맞게 프로시저를 함수같이 사용할 수 있다. 하지만 일반적인 함수와 다르게 프로시저는 배열을 인자로 전달받지 못한다. 반대로 프로시저를 사용해야 하는 대표적인 경우 중 하나가 반복문, loop이다. 다른 테이블 자체에서 loop를 돌리는 경우는 별다른 배열인자가 필요하지 않지만 유저가 무언가를 선택한 것에 대해서 그 배열을 가지고 loop를 돌리는 프로시저를 구현해야 한다면 프로시저의 인자로 배열을 넣어주어야 하는 상황이 종종 발생한다. 그렇다면 프로시저의 인자로 배열을 어떻게 넣어줄 수 있을까 바로 FIN.. 2020. 4. 24.
[MySQL] trigger란 1. 배경 서버와 DB가 통신을 할 때, 소켓통신이 아닌 이상 서버가 요청한 쿼리문을 통해 DB가 수정된다. 하지만 한 테이블에 여러 테이블이 얽혀있는 경우가 있다. 예를 들어, 한 게시물에 '좋아요'를 누르면 1) 게시물 좋아요 갯수 키 값 1 증가 2) 게시물 좋아요 테이블에 {게시물 - 유저(좋아요 누른)} 데이터 추가 3) 알림 테이블에 좋아요 추가 알림 추가 . . . 등등 여러 테이블이 동시에 수정되는 경우가 있다. 이런 단일 상황에 정말 여러개의 쿼리를 직접 만들어야 하는걸까? 아니다. 2. 개념 trigger : 방아쇠 - 어떠한 상황이 발생하면 그에 따라 자동으로 수행되도록 정해놓은 프로시저 trigger는 위에서 설명한 것과 같이 한 테이블에 변화가 생겼을 때 그것과 연관된 다른 테이블.. 2020. 4. 15.
[MySQL] MySQL 프로파일링 - 쿼리문 성능 비교 서버는 쿼리문을 통해 데이터베이스와 네트워킹을 한다. 이 때, 같은 결과물이라도 쿼리문을 어떻게 짜냐에 따라 성능, 즉 클라이언트의 대기시간이 결정되고 이는 결국 어플의 존속문제에도 큰 비중을 차지한다. 같은 결과물들을 위한 다양한 방법의 쿼리문을 짜는데 각각의 쿼리문의 네트워킹 비용, 대기시간 같은 성능을 체크하는 방법 하나를 소개하겠다. 1. 네트워킹 시간 : MySQL 프로파일링. 이 기능은 각각의 쿼리문의 걸린시간들을 리스트 혹은 상세한 시간을 기록해서 보여준다. 2. 네트워킹 비용 : Last_query_cost 이 기능은 각각의 쿼리문에 드는 총 비용(cpu 용량 등)을 보여준다. 비용과 걸린 시간은 비례하지 않는다. 비용이 커도 걸린 시간은 적을 수 있다. 사용법은 이러하다. 1. 프로파일링.. 2020. 4. 10.
[MySQL] Can't connect to local MySQL server through socket '/tmp/mysql.sock' 에러 해결 MySQL에 접속하려고 하는데 Can't connect to local MySQL server through socket '/tmp/mysql.sock' (2) 이런 오류가 발생하는 것을 볼 때가 있다. 이 문제의 원인은 경험상 1. MySQL을 재실행한 지 얼마 안되어서 부팅이 안 되어 있을 때, 2. MySQL이 실행되고 있지 않을 때 따라서 localhost:~/ brew services restart mysql 로 재실행 한 것을 조금 대기하면 들어가 질 수 있고 MySQL이 실행되고 있지 않다면 localhost:~/ brew services start mysql 로 MySQL을 재실행 시켜주면 되겠다. 2020. 4. 8.
[linux] MySQL 포트 변경하기 자신의 운영체제에 MySQL을 설치하고 실행하면 기본적으로 3306의 포트번호가 할당된다. 하지만 여러개의 mysql db를 관리해야 하는 시점이 오면 mysql 서버에 여러개의 포트를 할당해야 한다. 예를 들어 필자는 서버 하나를 운영하는 동안 이 서버를 배포하고 난 뒤 같이 배포된 DB가 아닌 지속적인 백그라운드 개발, 테스트를 진행하기 위해 또 다른 테스트DB를 만들고 데스크톱과 연결해야 하는 상황이 생겼다. (이 과정에서 dotenv를 이용하여 같은 서버에 대해 상황에 맞게 DB환경변수를 전환할 수 있는 환경을 구현하였다. 이 부분도 다음 포스팅에서 설명하려고 한다.) 기존에 로컬과 3306으로 연결되어 있었던 MySQL 데이터베이스는 AWS RDS에 올려놓은 DB서버였고 테스트 DB는 내 데스크.. 2020. 4. 7.
[MySQL] 프로시저를 사용한 cursor loop fetch 적용(sql의 for문) DB와 서버를 만지다 보면 DB에서 가져온 데이터 목록에 대해서 일괄처리, 그 중 반복문을 돌려 처리를 해야 하는 상황이 생긴다. 그런 상황은 단순한 상황과 복잡한 상황으로 나눠서 보자 예를 들어보자 먼저 단순한 상황을 생각해 보면 쿼리를 통해 db에서 가져온 목록들에 대해 for문을 돌려 특정 컬럼에 대해 분류를 해서 응답을 하는 경우가 있겠다. 이 같이 단순한 경우는 1. 쿼리문(DB)안에서 ORDER BY를 이용해 분류하고 서버에서 어느정도 분류된 데이터를 for문으로 돌려 나누는 방법 2. 쿼리문(DB) 단계에서는 다른 분류 없이 단순 select문을 통해 서버로 가져온 다음 서버단에서 for문을 통해 분류하는 방법 으로 나눌 수 있을 것이다. 이번엔 복잡한 상황을 생각해보자 예를 들어 스타벅스 .. 2020. 4. 6.
[MySQL] Insert 할 때 특정 컬럼만 select 보통의 INSERT문은 INSERT INTO [TABLE] (COLUMN1, COLUMN2, COLUMN3) VALUES (VALUE1, VALUE2, VALUE3) 의 형태로 사용된다. 하지만 본인은 쿼리문을 작성 중, 다른 테이블에서 어떠한 조건을 가진 레코드에 대해서, 해당 인덱스에 대해서만 다른 테이블에 그에 대한 정보를 insert해야할 일이 생겼다. 그리고 INSERT해야하는 값 중에는 다른테이블의 값이 아닌 일반 상수도 포함되어야 한다. 예를 들어, 학생들 중 점수가 90점이 넘은 학생들만 장학생 테이블에 추가한다고 해보자 먼저 학생 테이블 [STUDENT]를 보면 STUDENT_IDX STUDENT_NAME STUDENT_SCORE 1 철수 92 2 영희 87 3 민수 95 그리고 점수가 .. 2020. 3. 31.
[node.js] MYSQL 쿼리문 여러개(다중쿼리) 전송방법 node.js와 MYSQL을 연결하는 가장 기본적인 방법은 데이터베이스 config파일을 만든 뒤 const mysql = require("promise-mysql"); const dbConfig = { host : '[호스트 이름]', port : 3306, user : '[유저명]', password : '[비밀번호]', database : '[스키마 명]' } module.exports = mysql.createPool(dbConfig); 이렇게 작성을 해놓고 이 파일을 가져다 connection파일을 만드는 것이다. 이 connection파일을 사용하면서 db와 데이터를 주고받을 때 여러번 주고받는것은 효율성면에서 떨어진다. 이를 반대로 말하면 한 번 주고받을 때 많은 정보를 주고받는것이 효율적이.. 2020. 3. 30.
[MySQL] ORDER BY에 여러가지 기준과 선순위/후순위가 있을 때 ORDER BY는 기본적으로 SELECT 한 결과물들을 어떻게 정렬할 것인가를 결정해준다 예를 들면 한 유저가 갖고있는 쿠폰목록을 가져오려고 할 때 더 나중에 추가된 쿠폰(최근 쿠폰)부터 차례로 정렬해서 가져오고 싶을 때 ORDER BY coupon_idx DESC // 더 나중에 추가된 쿠폰의 idx부터 내림차순으로(DESC)! 를 SELECT문에 덧붙여주면 된다. 실제 쿼리문을 보자 SELECT coupon_idx, coupon_title, coupon_detail // 가져오려는 칼럼 FROM coupon// 테이블명 : coupon WHERE user_idx = 3// user_idx 칼럼이 3인 쿠폰을 선별해라! ORDER BY coupon_idx DESC// coupon_idx가 큰 것부터 내.. 2020. 3. 3.
[MySQL] 여러 테이블 합쳐서 SELECT하기 - JOIN ~ ON ~ 데이터베이스에서 게시글 정보를 꺼낼 때 '게시글'이라는 한 테이블이 게시글에 대한 모든 정보를 갖고있지 않는다. 예를 들면 우리가 한 게시글을 보면 게시글의 제목, 내용 뿐만 아니라 게시글을 쓴 사람, 게시글의 첨부파일, 게시글에 대한 좋아요수 등 완전 직접적이진 않은(?) 정보 또한 보여주고 있다. 이 게시글의 모든 정보를 데이터베이스에서 꺼낼 때 [게시글] 테이블엔 게시글의 '제목', '내용' 을 갖고있고 [유저] 테이블에 게시글을 쓴 '사람 정보' [게시글 좋아요] 테이블에 게시글과 좋아요 한 사람의 매칭되는 정보가 들어있다. 그리고 클라이언트가 게시글 정보 조회를 요청하면 서버는 이 세 테이블의 내용을 합쳐서 응답 데이터로 보내줘야 한다. 여기서 두가지 방법이 있다 1) 데이터베이스에서 세 테이블.. 2020. 3. 1.