발생일: 2017.02.06 키워드: mysql, fulltext search, fulltext 검색, 하이픈, 대시, hypen, dash, - 문제: MySQL의 BINARY MODE 의 Fulltext search에서 하이픈(hypen, 또는 대시, -) 캐릭터를 검색 대상에 포함하고 싶다. 어떻게 하면 될까? 해결책: 기본적으로 MySQL의 fulltext search는 letter, digits, ', _ 로 구성된 것을 단어로 본다. -는 word break 역할을 해서, mysql에서는 -로 구분된 단어를 검색하는 것과 동일하게 동작한다. 따옴표로 묶어도 동일하다 "12-34" "12 34" "12+34" "12~34" 모두 같은 결과를 리턴한다. 한 자리 검색어가 따옴표로 묶이는 경우, 검..
발생일: 2016.11.11 키워드: surrogate key, natural key 문제: 각 컬럼의 값이 유니크하다면, 전체 컬럼을 프라이머리로 만들어도 되지 않을까? 해결책: 각 컬럼이 유니크하더라도 각 행을 대표할 수 있는 키를 별도로 넣는 게 좋다는 조언이다. 데이터베이스의 모델 관리와 비즈니스 문제를 분리하기 위한 목적이라고 한다. 이렇게 비즈니스와 관계 없이 테이블의 row를 대표하는 키를 서로게이트 키라고 한단다. 반대로 비즈니스 개념을 대표하던 것은 내추럴 키이고. http://dba.stackexchange.com/questions/760/is-there-any-benefit-of-a-primary-key-that-comprises-all-columns-of-the-table
발생일: 2016.12.14 키워드: mysql, in multiple column 문제: WHERE 절의 IN, NOT IN 쿼리 구문에 여러 컬럼을 사용하고 싶다. 해결책: IN, NOT IN 구문으로 비교할 컬럼을 괄호로 묶어 처리하면 된다. SELECT * FROM task WHERE (user_id, task_id) NOT IN ( SELECT user_id, task_id FROM task_queue ); 논의:IN 구문에서 사용하는 컬럼 중에 인덱스가 적용되지 않은 컬럼이 있었는데, 해당 컬럼 때문에 쿼리 성능이 급격히 떨어졌다.실제론 위 방법 대신, 쿼리를 두 번 나눠 호출하는 방식으로 우회했다. 참고: http://stackoverflow.com/questions/8435107/mysql..
발생일: 2016.12.07 키워드: mysql, fulltext, boolean mode, innodb_ft_min_token_size, aws 문제: MySQL에서 BOOLEAN MODE 로 FULLTEXT 쿼리를 하려고 하는데, 검색어가 2글자인 경우 검색이 되지 않는다. 해결책: FULLTEXT 인덱스를 생성하는 기준에 캐릭터 개수에 대한 최소값이 있었기 때문이었다. innoDB인 경우 기본적으로 3글자, MyISAM DB인 경우 4글자가 기본값이다. 최소값 기준은 MySQL의 innodb_ft_min_token_size 설정하면 변경할 수 있다. 인스턴스의 기본 설정값이기 때문에, 값을 변경한 후엔 디비 인스턴스를 리스타트해야 하고, 인덱스도 새로 만들어야 한다고 한다. 우린 innoDB를 사용..
발생일: 2015.12.29 키워드: sqlite3, limit, oracle rownum 문제: sqllite 에서 오라클에서 제공하는 rownum 기능은 뭘까? 해결책: SQLite는 limit라는 기능을 제공한다. SELECT COL1, COL2 FROM TAB01 ORDER BY COL1 LIMIT 5 --5개 ROW를 출력하라는 의미 또 하나 OFFSET 이라는 기능도 있다 SELECT COL1, COL2 FROM TAB01 ORDER BY COL1 LIMIT 6 OFFSET 3 --3ROW를 건너뛰고 6개를 출력하라는 의미
발생일: 2016.01.05 키워드: sqlite3, sqlite 문제: sqlite3 을 사용해 저장하려고 하는데, 아래와 같은 오류가 발생한다. sqlite3: attempt to write a readonly database 해결책: 디비 파일의 권한 이슈였다. $ sudo chmod 775 /var/www/mysite $ sudo chmod 664 /var/www/mysite/sqlite.db 664 로 설정하는 것으로 해결했다.
발생일: 2010.02.10 문제: 업무 공유를 위해 팀원끼리 사용할 간단한 게시판을 하나 만들고 있다. 한 게시물에 여러 개의 태그를 달 수 있는 게시판이며, 태그는 형태로 구성되어 있다. 또한 gmail 의 목록처럼, 전체 목록을 뿌릴 때 엮여 있는 모든 태그를 보여준다. 좌측 메뉴에서 태그를 선택할 경우, 아래와 같이 해당 태그에 해당하는 게시물만 필터링하려고 한다. 그러다 매핑 테이블에서 and 조건으로 조회를 하려다가 난관에 봉착했다. 매핑 테이블에서 AND 조건을 추가하기가 쉽지 않다. task 테이블과 tag 테이블이 존재하며 매핑 테이블은 아래와 같이 구성되어 있다. [task_tag_map] task_id tag_id 데이터 샘플은 아래와 같다. (task_..
발생일: 2009.11.06 문제: 타시스템으로부터 인터페이스 받아오는 임시 테이블이 있다. 이 테이블은 데이터 전달용으로 임시로만 사용하기 때문에 따로 PK 를 두지 않았다. 헌데 이 테이블에 중복된 데이터가 인터페이스 되게 되었다. PK 가 없는 테이블에서 중복된 데이터를 어떻게 제거해야 할까... 다른 테이블로 옮기는 과정에서 프로시저를 통해 중복데이터를 제거하면 되겠지만, 현재 상황에서는 프로시저를 수정할 수는 없다. 단순하게 DELETE 구문을 통해 중복 데이터를 제거하려고 한다. 테이블 스키마는 대략 아래와 같다고 가정한다. IF_TEMP id (number) content (varchar2) 현재 데이터는 아래과 같다. id content 123 가나다 123 가나다 234 마바사 234 마..
발생일: 2009.11.01 문제: 오늘 디비 서버 이관 작업이 있었다. 헌데 기존에 디비 링크로 연결하던 테이블을 조회할 수 없다.... 서버 담당자에게 문의해보니, 링크를 새로 생성해야 한다고 한다. 디비 링크.. 한 번도 안해봤는데.... -_-a 해결책: 디비 링크에 대해 아주 깔끔하게 정리해 둔 포스트가 있다. [오라클] DB Link 설정 위 포스트가 간단 요약 정리라면, 아래 포스트는 친절한 예제와 함께 설명해준다. ORACLE|DB Link 생성 및 사용법 그리고 마지막으로, 디비 링크 조회 쿼리. 1) USER ACCOUNT SELECT * FROM USER_DB_LINKS 2) DBA ACCOUNT SELECT * FROM DBA_DB_LINKS 이렇게 하면 되겠다. * 실질적으로 문제..
발생일: 2009.06.03 문제: 타 시스템의 데이터를 가져와 쓰기 위해 오라클에서 Clob를 Varchar2 로 추출해내려고 한다. 해결책: 탐이 대답해준 Converting CLOBS to VARCHAR2 컬럼을 참고하자. 오라클 내장 함수인 dbms_lob.substr( clob_column, for_how_many_bytes, from_which_byte ); 를 사용하면 되겠다. 참고로 varchar2 의 최대 크기는 32k이다. 실질적으로 32k 보다 큰 CLOB 데이터를 VARCHAR로 변환해 쓰려면, 다른 함수를 정의해 써야하겠다~