320x100

DB 41

C++ Connector 사용시 conntect 함수에서 std::bad_alloc 발생

C++ Connector를 사용해 MYSQL에 연결하려고 하는 경우 connect()를 try ~ catch해보면 std::bad_alloc exception이 발생하는 경우가 있다. 현재 실행하는 애플리케이션 빌드 타입과 MYSQL lib 타입을 확인해보자. MYSQL에서는 일반 lib와 Debug용 lib를 별도로 제공하고 있다. release 버전을 debug 버전에서 참조해 쓰면 std::bad_alloc이 발생한다.

DB/MYSQL 2022.05.13

LAST_INSERT_ID() 사용 시 주의할 점

인터넷으로 검색을 하다보면 insert의 성공 결과로 LAST_INSERT_ID()를 사용하는 내용이 많다. 하지만 LAST_INSERT_ID()는 '마지막으로 성공한 Auto increment의 값'을 반환하는 함수이며, 없다면 기본값인 0을 반환한다. 다음과 같은 경우에는 사용자의 주의가 필요하다. 1. auto increment 없이 insert를 하는 경우 LAST_INSERT_ID()는 auto increment의 성공한 값을 반환한다고 했다. auto increment 설정 없이 아무리 insert 한다고 해도 LAST_INSERT_ID()는 0을 반환할 뿐이다. 자동으로 증가해야 될 시퀀스들을 따로 구현해 사용하는 경우 해당 함수로는 insert의 성공 여부를 판단할 수 없다. 2. inno..

DB/MYSQL 2022.01.07

redis plus plus 설치 해보기

redis를 사용하기 위한 언어별 client는 공식사이트에 리스트업 되어있다. https://redis.io/clients 그 중 C++의 redis-plus-plus를 설치해보고자 한다. redis-plus-plus는 C의 hiredis를 필요로 하기 때문에 hiredis를 먼저 설치해야 한다. hiredis https://github.com/redis/hiredis 다운을 받고 CMake로 vs solution 파일을 먼저 생성해준다. 더보기 CMake 설치 https://makga.tistory.com/341 Where is the sourece code: CMakeLists.txt 파일이 있는 경로 Where to build the binaries: sln 파일등 VC++ project 관련 파..

DB/Redis 2022.01.04

Windows에서 Redis 설치

주 사용 운영체제가 Windows 이므로 Windows에서 Redis 설치 방법을 정리한다. redis는 unix 환경만 지원해주지만, windows에서 사용할 수 있도록 포팅해주는 팀이 있어서 그것을 사용한다. 1. 설치 windows: https://github.com/microsoftarchive/redis/releases linux, unix: https://redis.io/download 윈도우 버전을 선택해 들어가서 본인이 원하는 버전을 선택해서 다운로드 받는다. .msi(설치 버전)과 .zip(포터블) 버전이 있으니 필요한 방법대로 선택한다. 다만 이 깃은 2016년 이후로 지원이 중단된 상태이며, WIndows 버전의 Redis를 사용하려면 Memurai을 사용하려고 안내해주지만, Memu..

DB/Redis 2021.12.26

쿼리실행 후 영향받은 쿼리 수 구하기

보통 쿼리를 돌리면 영향받은 로우 수라고 해서 Affected Rows를 구할 필요가 있어진다. MYSQL에서는 실제로 데이터가 변경된 수만 반영되며, 데이터가 변화가 없는 경우엔 0건으로 보여진다. Query SELECT ROW_COUNT(); C API mysql_affected_rows(); 업무 중에서 캐릭터 데이터를 insert 해주고 성공했을 경우(affected row > 0) 나머지 데이터들을 추가로 넣어주려고 했는데 데이터가 추가됐음에도 불구하고 row가 계속 0으로 나왔다. 트랜잭션이나 쿼리가 섞여 있는게 아니였는데도 말이다. https://stackoverflow.com/questions/14437539/how-to-use-row-count-with-transaction how to ..

DB/MYSQL 2021.11.05

모든 저장 프로시저내에서 텍스트 찾기

가끔 어느 테이블을 참고하는 프로시저의 목록을 찾고싶을 때가 있다. 저장 프로시저가 몇개 안될 때야 그냥 하나씩 열어보며 찾으면 되지만 갯수가 점점 늘어날수록 erm? uml?같은 도식도가 없으면 찾기 힘들다. 그럴 때 문자 검색으로 해당 테이블의 이름을 사용하는 프로시저를 검색할 수 있다. (다만 검색할 문자가 흔하고 짧은 경우 정확한 검색이 되지 않을 수 있다) SELECT ROUTINE_SCHEMA, ROUTINE_NAME, ROUTINE_DEFINITION, ROUTINE_TYPE FROM INFORMATION_SCHEMA.ROUTINES WHERE ROUTINE_DEFINITION LIKE '%검색할_테이블이름%' AND ROUTINE_TYPE = 'PROCEDURE';

DB/MYSQL 2021.10.25

쿼리 조건에 들어갈 내용을 파라미터로 전달하기

C++ 서버에서 MYSQL로 SELECT할 경우 임의로 조건을 컨트롤 하고 싶을 때가 있다. 예를 들자면 서버에서 어떤 때는 1,2,3 어떨 때는 3의 값만 SELECT을 하고 싶은데 하나의 SP로 컨트롤 하고 싶을 때 사용하는 방법이다. b.type 컬럼의 데이터 타입이 정수라고 하자. _type은 텍스트 파라미터로 전달되는데 단순히 WHERE b.type IN 으로 작성하면 에러가 난다. 형와 syntax가 맞지 않기 때문이다. 그래서 FIND_IN_SET이라는 함수를 써서 문제를 해결한다. FIND_IN_SET 함수는 콤마로 구분되어 있는 문자열('a,b,c,d')에 매칭되는 str문자('b')가 있는지 확인해주는 함수다. 매칭되는 것이 있을 경우 몇번째에 있는지 포지션 값을 리턴하고 없으면 0을 ..

DB/MYSQL 2021.10.18

동적 쿼리 작성하기

서버에서 SP를 호출하며 조건을 임의로 파라미터로 보내주려고 하던 와중에 필요한 것이 동적 쿼리였다. 예를 들면 character 테이블에서 class가 1,2,4인 것을 찾아야 하는 내용을 만들어야 하는데 1,2,4가 고정이 아니라 서버에서 임의로 변경이 가능한 조건이다. 그래서 sp내에 쿼리와 파라미터로 온 조건을 문자열로 합쳐 최종 쿼리를 완성하고 실행 시켜야 하는데 동적쿼리가 필요했다. 내용은 대략 다음과 같다. DELIMITER $$ DROP PROCEDURE IF EXISTS `sp_name` $$ CREATE DEFINER=`root`@`localhost` PROCEDURE `sp_name`( IN `_uid` BIGINT UNSIGNED ,IN `_type` VARCHAR(255) ) BE..

DB/MYSQL 2021.10.15
320x100