2013. 7. 30. 14:17

MySQL에서 DB에 데이터를 저장하고 리스트로 확인했을때 한글깨지는 현상이 생긴다.


MySQL콘솔로 가서  show variables like 'c%'; 를 실행 하면



C:\Program Files\MySQL\MySQL Server 5.1의 my.ini 를 열어 캐릭터 설정을 바꾼다.


[client]

default-character-set=utf8


[mysql]

default-character-set=utf8


[mysqld]

default-character-set=utf8


바꾼후 (제어판  - 관리도구 - 서비스 - MySQL)로 가서 서버 재가동


이후 아까와 같이 치면 latin1 -> utf-8로 바껴있을 것이다.


그리고 테이블 생성할때 CHARSET=utf8로 해야한다.



create table users(
	num int primary key AUTO_INCREMENT,
    userid VARCHAR(10),
    password VARCHAR(10),
    nickname VARCHAR(10),
    birthday date,
    email VARCHAR(20)
)ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8;



이후 데이터를 너보니....



잘나온다...

'DBMS > MySQL' 카테고리의 다른 글

MYSQL 에서 그룹함수(group by)  (0) 2013.07.29
숫자관련 데이타형에 문자형식으로 insert하기  (0) 2013.07.29
Mysql에서의 null값 고찰  (0) 2013.07.29
MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:33

출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=40


특정 컬럼으로 그룹핑(group by)을 할때 그룹별 제한하기

 

그룹별 출력 쿼리를 사용할때 조건을 제한 할때는 having을 사용합니다.

having 이라는 예약어를 사용하여 그룹별 제한이 가능합니다.

 


mysql> select code,count(*) from goods group by code;
--code별로 그룹을 짓고 모든 코드와 그룹별코드의 갯수를 출력한다.
mysql> select code,count(*) from goods group by code having count(*) = 1;
--code별로 그룹을 짓고 그룹코드갯수가 1인 코드와 그룹별코드의 갯수를 출력한다.


 

※ having절에는 그룹함수가 옵니다.


'DBMS > MySQL' 카테고리의 다른 글

MySQL 한글깨짐  (0) 2013.07.30
숫자관련 데이타형에 문자형식으로 insert하기  (0) 2013.07.29
Mysql에서의 null값 고찰  (0) 2013.07.29
MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:32

보통 SQL에서는 데이타를 입력할때 문자관련 데이타형에는 ''을 앞뒤에 붙이고 숫자관련 데이타형에는 ''을 안붙이고 놓습니다.

하지만 mysql에서는 숫자관련 데이타를 입력할때 ''을 붙여도 mysql에서 알아서 입력해줍니다.

''을 붙여서 입력하게되면 예외처리도 처리해줍니다. 아래의 예를 봅시다.

 

mysql> desc leejunsik;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| a      | int(11)  | YES |      | NULL    |        |
+-------+---------+------+-----+---------+-------+


insert into hong values('13');
--13이 정상적으로 입력됩니다.
 insert into hong values('1A');
--1만 입력됩니다.
 insert into hong values('AA');
--0이 입력됩니다.
 insert into hong values(AA);
--에러가 납니다.
 insert into hong values('');
--0이 입력됩니다.



'DBMS > MySQL' 카테고리의 다른 글

MySQL 한글깨짐  (0) 2013.07.30
MYSQL 에서 그룹함수(group by)  (0) 2013.07.29
Mysql에서의 null값 고찰  (0) 2013.07.29
MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:31

출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=46


1.null값이란?

 

RDBMS에서 null 은 0이나 공백이 아닌 값을 알수가 없다입니다. 이말은 값이 없다 입니다.

이는 Mysql상에서 문자열을 합치거나 수치를 계산할때 문제가 됩니다. 특히 수치계산일때는 not null로 하거나 defailt 옵션을 주어야 합니다.

 

2.null값의 잘못된 처리

 

수치의 경우

cretae table lee(

a int null,

b int null);

insert into lee values(null,12);

select a+b from lee;

라고 한다면 12가 나올것 같지만 null값이 포함된 계산식은 무조건 null이 나옵니다.

그래서 defailt 문을 써주는게 좋거나 not null을 사용하는게 좋습니다.

 

문자열의 경우

cretae table lee(

a varchar(10) null,

b varchar(10) null);

insert into lee values(null,'lee');

select concat(a,b) from lee;

라고 한다면  nulllee나 lee가 나올것 같지만 결과는 null로 나온다.

 

3.많은 양의 null처리

 

상당히 많은 양의 레코드에 null이 있다면 계산하거나 문자열을 연결하는데 문제가 많다.

update table_name set num=0 where num is null;

update table_name set num='' where num is null;

와같이 null값을 지정된 문자나 숫자로 바꾸어준다.

 

※ table을 만들시에 모든컬럼에 not null을 주는게 좋습니다.

'DBMS > MySQL' 카테고리의 다른 글

MYSQL 에서 그룹함수(group by)  (0) 2013.07.29
숫자관련 데이타형에 문자형식으로 insert하기  (0) 2013.07.29
MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
JOIN(조인) 사용하기  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:29

출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=47


1.TABLE 관련

 

OPTIMIZE TABLE

table type이 myisam이나 bdb에서 사용하며 많은양의 데이터가 삭제되었거나 삽입되었을때 사용하면 속도향상에 좋습니다.

ex)optimaze table table_name;

 

2.QUERY 관련

 

JOIN

join이 subquery보다 빠르다.
join시 사용되는 컬럼은 동일한 column type과 길이를 가져야만 최적의 속도를 보장한다.

 

index설정

인덱스를 적절히 잡아줍니다.

 

필요한 컬럼만 select 한다.

select * 되어 있는부분을 필요할 필드만 가져옵니다.

 

processlist로 실행 쿼리를 mysql상태를 체크

cd /usr/local/mysql
./bin/mysqladmin -i3 processlist -ppassword

//3초에 한번씩 실행됩니다.

 

잘못된 query 발견

explain으로 질의과정 점검 몇번의 레코드를 검색하여 수행하는지 그리고 해당 컬럼이 index를 잘타는지 보고 쿼리를 수정합니다.

 

slow query log기능

 slow query log를 걸어놓고 slow query time를 한 5초로 정해주시면 5초 이상 실행이 걸리는 쿼리는 모조리 로그에 남습니다.
그 query를 튜닝합니다.(explain이용)

 

query우선 설정

select 구문에는 
select HIGH_PRIORITY id,name, ... from table_name ...

delete, insert, update 구문에는
delete LOW_PRIORITY from table_name ....

 

mysql 4.x 이상부터 지원! 

query cache을 사용합니다.

 

int형과char형의 검색속도차이

int 가 char보다는 검색속도가 더 빠르다고 하지만 시스템구성과 환경마다 다릅니다.

 

3.하드웨어 관련

 

웹호스팅이 아닌 서버호스팅을 합니다.

 

평균 조회 레코드 50만건이상

조회 데이타가 50만건~100만건이면 DB서버와 웹서버를(이미지 서버등등) 나누어 분산처리(2-Tier)하며 조회 건수가 100만건 이상은 ORACLE같은 상용 DB로 교체해야 한다.

 

메모리를 증설 합니다.

1-2G 정도

 

하드디스크 스카시로 교체

e-ide보다 데이타 io(입/출력) 더 빠르다.(10000 rpm이상급)

'DBMS > MySQL' 카테고리의 다른 글

숫자관련 데이타형에 문자형식으로 insert하기  (0) 2013.07.29
Mysql에서의 null값 고찰  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
JOIN(조인) 사용하기  (0) 2013.07.29
4.0 추가기능  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:23

출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=50


select * from goods where name like replace(name,' ','') like '%$name%';
(goods table에서 name필드의 공백을 제거하고 변수와 like 비교검색)
 
select count(*) from goods where left(signdate,10) = curdate()
(goods table에서 signdate(data타입)의 좌측의 10개문자만 가져와서 오늘 날짜와 비교)
 
select * from goods where from_unixtime(orderdate) between '2003-01-01' and '2004-01-01';
(goods table에서 timestamp형인 날짜형을 실제 날짜와 비교시  from_unixtime()함수로변환해사용)
 
select SUM(if(paymethod='bank',round(payM/exchange),payM)) from trade;
(trade테이블에서 paymethod컬럼의 값이 bank이면 round(payM/exchange) 의값들을 아니면 payM의 값들의 합을 출력합니다.)
 
select g.name,count(tg.idx) from goods as g,trade_goods as tg where g.idx=tg.goodsIdx  group by g.idx order by 2 desc;
(goods와 trade_goods을 조인하여 trade_goods 테이블에서 판매된 상품의 idx별로 그룹지어 2번째 출력컬럼인 count(tg.idx)의 오름차순으로 출력합니다.)
 
select code,count(code) from goods group by code having count(code)>1
(goods table에서 code 별로 그룹지어 count(code)의 갯수가 2개 이상인것만 출력합니다.)
 
select name,count(tradecode) from trade_goods where tradecode='$tradecode' group by tradecode having count(tradecode)>1;
(tradecode table에서 $tradecode변수와 tradecode컬럼이 같은 레코드에서 tradecode별로 정렬하고 그룹별갯수가 1개 이상인것만 출력한다.)-(주문서 중복 확인 쿼리)


'DBMS > MySQL' 카테고리의 다른 글

Mysql에서의 null값 고찰  (0) 2013.07.29
MYSQL 성능 향상 정리  (0) 2013.07.29
JOIN(조인) 사용하기  (0) 2013.07.29
4.0 추가기능  (0) 2013.07.29
[MySQL] 자동증가값  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:18

INNER JOIN (교집합)

 

INNER JOIN(NORMAL JOIN)은 여러 테이블의 조건들이 모두 만족했을때만 데이타를 보여주게 되며 한쪽 테이블의 조건이라도 만족하지 않으면 데이타를
보여주지 않습니다.

 

LEFT OUTER JOIN (교집합)

 

LEFT OUTER JOIN(교집합)은 여러 테이블의 조건들이 모두 만족하지 않더라도 데이타를 보여줍니다.

 

※ 조건이 만족하지 않는 테이블의 데이타값은 "NULL" 값으로 출력된다.

 

간단한 조인 예제

 

개요

 

출석 테이블을 만든다 가정하면 normal join 으로는, 한번도 출석하지 않은 학생은 목록에도 보이지 않게 되지만, outer join 으로는 모두 볼 수 있게 됩니다.

 

예제

 

[테이블 생성]

 

drop table book;
create table book
(
code varchar(10),
name varchar(10)
);
insert into book values ('1111','사랑책');
insert into book values ('2222','이별책');
insert into book values ('3333','웃긴책');

 

drop table animal;

create table animal
(
code varchar(10),
name varchar(10)
);
insert into animal values ('1111','사자');
insert into animal values ('2222','호랑이');
insert into animal values ('3333','오리');

 

drop table buy;
create table buy
(
book_code varchar(10),
animal_code varchar(10)
);
insert into buy values ('1111','1111');
insert into buy values ('2222','2222');
insert into buy values ('3333','4444');

 

[LEFT OUTER JOIN 예제]

 

select
 b.name, c.name
from
 buy as a
 left outer join book as b on a.book_code = b.code
 left outer join animal as c on a.animal_code = c.code;

 

※ left outer join 시에는 최대한 중복건이 안나오도록 유일한 컬럼으로 비교해야 한다.

※ left outer join 시에 조건에 만족하지 않는 테이블의 컬럼값은 "NULL" 로 표기된다.

 

[INNER JOIN 방법1]

 

select 
 b.name, c.name
from
 buy as a
 inner join book as b on a.book_code = b.code
 inner join animal as c on a.animal_code = c.code;

 

[INNER JOIN 방법2]

 

select 
 b.name, c.name
from
 buy as a, book as b, animal as c
where
 a.book_code = b.code and a.animal_code = c.code where a.code = '1111';

select 
 b.name, c.name
from
 buy as a, book as b, animal as c where a.book_code = '1111';

 

여러 테이블 컬럼의 모든 경우의 수를 출력한다.

 

select * from book, animal, buy;

select * from book a, animal b, buy c;

 

-- 3개테이블 컬럼의 경우의 수를 모두 출력한다.

-- 모든 경우의 수 = 각테이블의 로우스를 곱한값

 

RDBMS에서 JOIN은 중요한개념입니다.

서로 관련된 정보 중 정보의 관계가 1:N으로 설계하게 되면 서로 분리하여 2개의 테이블로 분리시킵니다. 여러개로 나누면서 서로 연결할수있는 공통 컬럼을 만들어두면 여러모로 좋은점이

많습니다. 그렇다고 table하나로 해결하는것이 효율적이지 않다는것은 아니지만 각각의 장단점이

있습니다.

 

table category

create table category(

num int not null primary key auto_increment,

name varchar(20) not null)

insert into category values(null,'컴퓨터');

insert into category values(null,'가전제품');

insert into category values(null,'통신기기');

 

table s_category

create table s_category(

num int not null primary key auto_increment,

cate_num int not null,

name varchar(20) not null)

insert into s_category values(null,1,'cpu');

insert into s_category values(null,2,'냉장고');

insert into s_category values(null,3,'pcs');

 

category 와 s_category테이블을 통해 어떤 대분류에 속한 소분류가 있는지 알아보자

ex)select * from category ,s_category where category.num=s_category.cate_num;

만약에 where절을 주지 않게 되면 table category와 table s_category를 곱한 값이

나오게 됩니다.

category의 첫번째 레코드를 가져온후 s_category의 첫번째레코드를 가져와 조건이 맞으면 출력

category의 첫번째 레코드를 가져온후 s_category의 두번째레코드를 가져와 조건이 맞으면 출력

category의 첫번째 레코드를 가져온후 s_category의 세번째레코드를 가져와 조건이 맞으면 출력

 

category의 두번째 레코드를 가져온후 s_category의 첫번째레코드를 가져와 조건이 맞으면 출력

category의 두번째 레코드를 가져온후 s_category의 두번째레코드를 가져와 조건이 맞으면 출력

category의 두번째 레코드를 가져온후 s_category의 세번째레코드를 가져와 조건이 맞으면 출력

..........

 

where 조건이 없으므로 위의 순서대로 모두 출력이 되는것이다.

 

또한 컴퓨터 카테고리에 속한 소분류만을 보고싶다면 다음과 같이 조인하면 된다.

ex)select a.num,a.name,b.num,b.name from category a,s_category b

where a.num=b.cate_num and a.num=1;


'DBMS > MySQL' 카테고리의 다른 글

MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
4.0 추가기능  (0) 2013.07.29
[MySQL] 자동증가값  (0) 2013.07.29
Mysql insert 와 select 같이 쓰기  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 17:12

출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=61


ssl연결,sql캐시,다중삭제,union,fulltext,외래키(Foreign Keys)


목차


union

ssl연결

SQL Cache 기능

fulltext

외래키(Foreign Keys)




union

 

-select 한 여러 결과를 한번에 서버로부터 가져오는 기능이다.


ex)

create table lee{
a int not null auto_increment primary key,
b char(10) null,
c blob null);
create table lee1{
a int not null auto_increment primary key,
b char(10) null,
c blob null);
적당히 lee와 lee1에 레코드를 입력하고

select * from lee union select * from lee1

select a,b from lee union select a,bzz from lee1

ad)컬럼의 수가 같고 각컬럼당 데이타형이 같아야합니다.


ssl연결

 

ssh클라이언트인 putty나 zterm으로 연결하듯이 mysql관리 클라이언트를 이용해 연결시

ssl을 이용해서 보안을 강화해서 연결한는것

 

SQL Cache 기능

 

처음 실행한 SQL의 결과를 캐시에 저장한후 이후에 같은 SQL을 실행시에 새롭게 실행하지 말고 캐시에 저장된 결과값을 가져오는 기술

※ 캐시 메모리를 이용하므로 속도가 빠르다.

※ 해당 머신의 캐시 메모리 크기가 크면 클수록 좋은 성능을 낸다.

※ ORACLE, MSSQL, DB2 와 같은 DBMS는 예전부터 지원하던 기능이다.

 

fulltext

 

통상적으로 어떤한 dbms라도 일반적인 방법으로는 like '%keyword%'와같은 조건으로 검색할때는 인덱스를 사용할수 없습니다. 

왜냐하면 keyword라는 단어가 문자열에서 어디에 있는지를 인덱스을 사용해도 알수없기 때문입니다. like keyword%와 같이 keyword로 시작하는 문자열을 찾을때는 인덱스를 사용할수있지만 keyword가 중간에 포함되는 문자열을 찾는 것은 단순한 인덱스로 해결할수 없습니다. 따라서 like '%keyword%'와 같은 쿼리는 어쩔수없이 모든 레코드를 검색해야하고 따라서 검색시간이 많이 걸립니다. 하지만 아쉅게도 게시판등의 시스템에서는 like '%keyword%' 와 같은 검색을 아주 많이 사용합니다. fulltext는 백터스페이스 모델을 이용하여 like '%keyword%'와 같은 쿼리도 인덱스를 사용할수있도록 해주는겁니다.

mysql4.0까지는 지원하지만 single byte만(1바이트-영문)만 지원합니다. 한글등 기타언어들은 2바이트인경우가 많아서 multibyte는 아직 지원하지 않습니다.

3.x대 지원안함

4.0대 지원함(싱글바이트)

4.1대 알파 지원함(싱글,멀티바이트는 불안함)

fulltext는 varchar나 text컬럼에 인덱스를 만들고 검색을 빠르게 할대 사용되지만 한국등의 멀티바이트는 지원하지 않습니다. fulltext는 막강한 기능이지만 아직 한글을 지원하지 않는다.

 

외래키(Foreign Keys)

현재도 3.x, 4.x 버전에서 INNO DB를 사용하면 지원 받을 수 있다. 하지만 기본 테이블인 MyISAM에서는 4.1 버젼부터 지원 예정이다.

'DBMS > MySQL' 카테고리의 다른 글

MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
JOIN(조인) 사용하기  (0) 2013.07.29
[MySQL] 자동증가값  (0) 2013.07.29
Mysql insert 와 select 같이 쓰기  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 13:21

참고 및 출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=8


Auto_increment 예약어


자동으로 1씩 증가되는 키워드


사용조건


1. not null

2. 데이터형이 mediumint, int bigint

3. 기본키나 고유키가 반드시 있어야 함.


사용예제

create table test

(

a int not null auto_increment primary key,

b char(10)


);


방법1

insert into test values(1, 'aa');

 - a 컬럼값에 1인 값이 있다면 중복에러를 발생하고 중복값이 없다면 해당값 그대로 입력됨.


방법2

insert into test(b) values ('aa');

- 첫번째 입력이라면 a컬럼에 자동으로 1이 들어가며 첫번째 입력이 아니라면 마지막에 입력된 값에서 자동으로 1이 더해져서 입력됨.


방법3

insert into test(a,b) values (null, 'aa');

- 방법2와 동일한 방법

- 첫번째 컬럼값이 null값이므로 auto_increment가 없다면 에러가 나고 있다면 auto_increment가 실행되어 자동채번이 된다.


insert into test(a,b) values ("", 'aa');

- 방법2와 동일


※ 방법1보다 방법2의 SQL쿼리가 더명확하고 간결하므로 자주 사용


- 자동 증가값 초기화

alter table test auto_increment = 1

※ 이왕이면 테이블의 튜플들을 다 지우고 초기화한다.


- 마지막으로 입력한 auto_increment 값 알아내기

select last_insert_id();


 

'DBMS > MySQL' 카테고리의 다른 글

MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
JOIN(조인) 사용하기  (0) 2013.07.29
4.0 추가기능  (0) 2013.07.29
Mysql insert 와 select 같이 쓰기  (0) 2013.07.29
Posted by 1+1은?
2013. 7. 29. 11:03

출처 : http://stackoverflow.com/questions/4989583/insert-combine-value-and-select



	insert into MyTable (ColA, ColB, ColC) values ('A', 'B', 'C')


 INSERT INTO MyTable
            (ColA,
             ColB,
             ColC)
SELECT 1,
       colBB,
       colCC
FROM   MyTable2 

출처 : http://www.zetswing.com/bbs/board.php?bo_table=MySQL_LEC&wr_id=52



create table table_name select
이문은 테이블을 생성함과 동시에 바로 레코드를 입력하는 경우에 사용할수있습니다.
따라서 테이블을 다른곳에 복사할때 사용할수있습니다.
ex)select * from jun;
----------------------------
no item type amount place---
1    2   3    aaaa   ddd
2    3   4    dddd   sss
----------------------------

ex)create table jun_clone select * from jun;
-jun_clone는 새로 만들어지면서 jun과 table 스키마는 같게 되지만 index는 배제된다.
이는 primary key도 배제되어 복사된다. 한마디로 복사된 table에는 primary key나
index는 복사되지 않는다.
 
insert into table_name select
-이문은 기존에 존재하는 테이블에 select 한 내용을 insert할때 사용합니다.
단지 테이블 구조가 같아야 한다. 아니라면 컬럼 데이타형과 갯수를 맞추어야
성공가능하다.
ex)insert into table_name select * from table_name2;
-table_name2의 모든컬럼을 적용한 레코드 전부가 table_name에 입력된다.




'DBMS > MySQL' 카테고리의 다른 글

MYSQL 성능 향상 정리  (0) 2013.07.29
초급QUERY  (0) 2013.07.29
JOIN(조인) 사용하기  (0) 2013.07.29
4.0 추가기능  (0) 2013.07.29
[MySQL] 자동증가값  (0) 2013.07.29
Posted by 1+1은?