데이터 검색

SQL 검색문의 기본적인 구조

select 열_리스트

from 테이블_리스트

where 조건

예를 들어, '컴퓨터과 학생의 이름(name)과 학번(sno)을 검색하라는 검색문은 다음과 같이 표현한다.

select name, sno

from student

where dept = '컴퓨터';


테이블의 열 전부를 검색하는 경우

select *

from student;


조건 검색

query: 학생(student) 테이블에서 학과(dept)가 '컴퓨터'이고 학년(year)이 4인 학생의 학번(sno)과 이름(name)을 검색하라.

select sno, name

from student

where dept = '컴퓨터' and year = 4;

# 일반적으로 where절에 나오는 조건식에는 비교 연산자 ==, !=, >=, <=, >, < 등과 불리언 연산자 and, or 그리고 not 을 사용할 수 있다. 또한 필요한 경우에 괄호를 사용할 수 있다.


순서를 명시하는 검색

query: 등록(enrol) 테이블에서 중간성적(midterm)이 90점 이상인 학생의 학번(sno)과 과목번호(cno)를 검색하되 학번(sno)에 대해서는 내림차순으로, 또 같은 학번에 대해서는 과목번호(cno)의 오름차순으로 검색하라.

select sno, cno

from enrol

where midterm >= 90

order by sno desc, cno asc;

# 일반적으로 검색 결과는 시스템이 정하는 순서에 따라 출력된다. 그러나 사용자가 검색 결과의 순서를 오름차순(asc) 이나 내림차순(desc)을 명시할 수 있다. 여기서 처음 나온 sno는 1차(주) 정렬이고, 두 번째 나온 cno는 2차(부) 정렬이다. 2차 정렬은 1차 정렬 범위내에서 정렬시키는 것을 말한다.


산술식과 문자 스트링이 명시된 검색

query: 등록(enrol) 테이블에서 과목번호(cno)가 'C312'인 중간성적(midterm)에 3점을 더한 점수를 학번(sno), '중간성적 =' 이란 텍스트를 갖는 시험, 그리고 점수라는 열이름으로 검색하라.

select sno as '학번', '중간시험=' as 시험, midterm+3 as '점수'

from enrol

where cno = 'C312';

# 일반적으로 select 절에는 열이름뿐만 아니라 문자 스트링을 명시할 수 있으며 열이름, 상수 그리고 산술 연산자로 구성된 산술식이 나타날 수 있다. 필요한 경우에 괄호를 산술식에 사용할 수 있다. 

"as  학번" 이라는 명시는 sno의 별명을 지정한 것이다. "as 시험"과 "as 점수"가 명시되지 않았다면 열이름이 공백이 되었을 것이다 .뒤에 나오는 질의문 예는 편의상 모두 적절히 별명이 명시된 것으로 가정한다.


복수 테이블로부터의 검색

query: 과목번호(cno) 'C413'에 등록한 학생의 이름(name), 학과(dept), 성적(grade)를 검색하라.

select student.name, student.dept, enrol.grade

from student, enrol

where student.sno = enrol.sno 

and enrol.cno = 'c413';

# 관계 데이타베이스 시스템이 다른 유형의 데이타베이스 시스템에 비해 강력한 점은 둘 이상의 테이블을 조인할 수 있다는 것이다. 위의 예는 SQL에서 조인이 어떻게 표현되는가를 보여주고 있다. 

조인 검색은 FROM 절에 관련 테이블들을 여러 개 명시할 수 있다는 것이다. 이때 열이름이 모호하게 되면 열이름을 붙인 한정된 열이름을 써야 한다.

이 조인이 필요한 테이블을 SQL2에서는 사용자가 FROM절에 직접 명시할 수 있도록 하고 있는데 다음 세 가지 형태가 있다.

1. 테이블1 join 테이블2 on 조건식

2. 테이블1 join 테이블2 using(열_리스트)

3. 테이블1 natural join 테이블2

따라서 앞의 질의문을 이 형식으로 표현하면 다음과 같다.

select name, dept, grade

from student join enrol on (student.sno = enrol.sno)

where enrol.cno = 'C413';


select name, dept, grade

from student join enrol using(sno)

where enrol.cno = 'C413';


select name, dept, grade

from student natural join enrol

where enrol.cno = 'C413';

# 이 세 형식은 모두 그 의미가 동등하지만 표현에 약간의 차이가 있다. 

형식 1은 where절에서 명시하는 조인 조건을 from 절로 옮긴 것과 같다. 

형식 2는 열_리스트에 나열된 공통 열을 이용하여 동등 조인한 것인데 공통 열은 결과 테이블에 한 번씩 다른 나머지 열보다 먼저 나타난다.

형식 3은 조인되는 두 테이블에 공통되는 모든 열을 포함시킨 동등 조인으로 공통 열은 결과 테이블에 한 번씩 왼쪽에 먼저 나타난다.


자기 자신의 테이블에 조인하는 검색

query: 같은 학과 학생들의 학번을 쌍으로 검색하라. 단, 첫 번째 학번은 두 번째 학번보다 적게하라.

select s1.sno, s2.sno

from student s1, student s2

where s1.dept = s2.dept

and s1.sno < s2.sno;


집단 함수(aggregate function) 를 이용한 검색

'학생수는 몇 명인가?' 하는 간단한 잘의어는 지금까지 나열한 것으로 표현할 수 있다. 이런 문제를 해결하기 위하여 SQL은 특별히 집단 함수 또는 열함수(column function) 를 제공하고 있다. 이 집단 함수에는 count, sum, avg, max, min이 있는데 이들의 기능들은 한 열의 값 집합에 적용하여 다음과 같은 결과를 생성한다.

count : 값의 개수

sum : 값의 총계

avg : 평균 값

max : 최대 값

min : 최소 값

물론 sum, avg는 수값에만 적용된다.


query: 학생 테이블에 학생수가 얼마인가를 검색하라.

select count(*) as 학생수

from student;

# count(*)의 처리 대상은 행(튜플)의 집합이고 그 결과는 그 집합에 속하는 행의 수이다. 이때 중복되는 행도 함께 포함된다.


query: 학번(sno) 이 300인 학생이 등록한 과목(cno)은 몇 개인가?

select count(distinct cno)

from enrol

where sno = 300;

# 수를 계산하려면 count(distinct 열_이름) 으로 명시하면 된다. 명시된 열에 속한 값의 집합에서 상이한 값만을 대상으로 sum이나 avg를 구할 때는 "DISTINCT"를 명시해야 한다.


query: 과목 C413에 대한 중간 성적의 평균은 얼마인가?

select avg(midterm) as 평균점수

from enrol

where cno = 'C413';

# avg 함수 결과값의 타입은 해당 열의 데이타 타입과 같다.


Group By를 이용한 검색

query: 과목별 기말 성적의 평균을 검색하라.

select cno, avg(final) as '기말평균'

from enrol

group by cno;

# group by는 논리적으로 from 절에 있는 테이블을 group by절에 명시된 열의 값에 따라 그룹으로 분할한다. 물론 그렇다고 테이블이 데이타베이스내에서 물리적으로 분할되는 것은 아니다.

위의 예에서는 등록(enrol) 테이블을 5개의 그룹(C123, E123, ...)으로 분할하여 각 그룹별로 select 문을 실행한다. 이와 같이 하나의 테이블을 접근하여 몇 개의 그룹으로 만들 수 있으나 group by 자체는 어떤 순서를 명시하지는 않는다.

따라서 과목별 순서를 명시하려면 order by cno절을 group by절 다음에 첨가하면 된다.


having 을 사용한 검색

query: 세 사람 이상 등록한 과목의 기말 평균 성적을 검색하라.

select cno, avg(final) as 평균

from enrol

group by cno

having count(*) >= 3;

# having은 각 그룹의 구성 요건을 명시한다. 만일 group by절이 생략되면 테이블 전체를 하나의 그룹으로 취급한다.


부속 질의문(sub query)을 사용한 검색

query: 과목 번호(cno) 'C413'에 등록한 학생의 이름(name)을 검색하라.

select name

from student

where sno in

(select sno

from enrol

where cno = 'C413');

# 부속 질의문은 다른 질의문에 중첩되어 사용된 검색문으로서 select-from-where-group by-having의 형태를 취한다. 위의 예에서 부속 질의문은 in 다음에 사용되었는데 이때 부속 질의문은 검색 결과로 학번값의 집합 {100, 300, 400} 을 생성하고 in은 집합의 멤버십 연산자로 해석할 수 있다. 

그러므로 위의 질의문은 다음과 같은 질의문의 뜻이 된다.

select name

from studnet

where sno in (100, 300, 400);

또한 위 원래의 질의문은 조인을 사용하는 질의문으로 표현할 수 있다. 

select student.sname

from studnet, enrol

where student.sno = enrol.sno

and enrol.cno = 'C413';

이 원래 질의에 대한 이 두 가지 형색의 질의문은 모두 맞다. .이것은 하나의 질의에 대한 표현 형식이 여러 가지 있을 수 있다는 것을 뜻한다. 다만 어느 형식을 쓰느냐 하는 것은 사용자의 기호에 달려 있다. 


query: 과목번호 'C413'에 등록하지 않은 학생의 이름을 검색하라.

select name

from student

where sno not in 

{select sno

from enrol

where cno = 'C413');

# 부속 질의문은 in 이외의 경우에도 사용할 수 있다. 


query: 학생 김 연아와 같은 학과에 속하는 학생의 이름과 학과를 검색하라.

select name, dept

from student

where dept = 

(select dept

from student

where name = '김 연아');


like를 사용하는 검색

query: 과목번호(cno)가 c로 시작되는 과목의 번호와 과목이름(cname)을 검색하라.

select cno, cname

from course

where cno like 'c%';

# like 프레디킷은 열 이름과 함께 스트링 상수를 명세한 검색 조건이다.

이 예에서 사용된 '%' 는 c로 시작하기만 하면 어떤 길이의 어떤 문자 스트링도 관계없다는 뜻이다. 

만일 sname like s'__'  라 하면 s로 시작되는 세 문자를 말하고, sname like '%s__' 라 하면 스트링 끝에서 세 번째가 s인 문자열을 한다. 또 단순히 sname like '%s%' 라 하면 s가 포함된 문자열을 말한다.


NULL을 사용한 검색

학생 테이블에 학번이 600, 이름이 김 연아, 학과가 NULL인 튜플이 있다고 가정한다.

query: 학과(dept)가 NULL인 학생의 학번과 이름을 검색하라.

select sno, snmae

from student

where dept is NULL

# 일반적으로 NULL을 검색 조건속에 명시할 때는 '열_이름 is [not] NULL' 의 형식만 허용된다. 

열_이름 = NULL의 형식은 불법적인 것으로 허용되지 않는다. 또한 널값은 조건식을 실행할 때 어떤 다른 값과 비교하면 어떤 비교 연산자이든지간에 거짓으로 된다. 


exists를 사용하는 검색

query: 과목 'C413'에 등록한 학생의 이름을 검색하라.

select name

from student

where exists

(select *

from enrol

where sno = student.sno

and cno = 'C413');

# exists는 존재 정량자(existential quantifier)로서 exists 다음에 나오는 검색문의 실행 결과 검색된 튜플이 존재하는가를 검사한다. 따라서 이 부속 질의문은 exists(select * from) 검색문을 실행한 뒤 그 결과가 공집합이 아니면 참이고, 공집합이면 거짓으로 판정한다.

위의 예에서는 각 학생이름에 대한 학번을 검색한 뒤 그 학번에 연관된 등록(enrol) 테이블에 exists 검색문을 수행해서 참일 때 그 학생이름을 결과에 속하도록 한다. 따라서, 이 질의문은 사실상 '학생 테이블에서 학생이름을 검색하는데 어떤 학생이냐 하면 과목 'C413'에 등록하여 등록(enrol) 테이블에 튜플이 존재하는 그런 학생이다.' 라는 뜻이 된다.


query: 과목 'C413'에 등록하지 않은 학생의 이름을 검색하라.

select name

from student

where not exists

(select *

from enrol

where sno = student.sno

and cno = 'C413');


union 이 관련된 검색

query: 3학년이거나 또는 과목 'C324'에 등로한 학생의 학번을 검색하라.

select sno

from student

where year = 3

union

select sno

from enrol

where cno = 'C324';

# union은 일반 집합론의 합집합과 같다. 따라서 union이 사용되면 결과 테이블에서 중복되는 튜플은 제거된다.


'Programming > DataBase' 카테고리의 다른 글

keywork BETWEEN, IN  (0) 2016.08.15
Basic  (0) 2016.07.31
SQL 데이터 조작문 - 데이터 삽입  (0) 2014.09.08
SQL 데이터 조작문 - 데이터 갱신  (0) 2014.09.08
데이터베이스의 개요  (0) 2014.09.07
Posted by scii
:


데이터베이스의 구성 요소

데이터베이스의 구성 요소에는 테이블, 레코드, 필드 이렇게 3가지가 있다. 

이  름 

학  번 

수강과목 

김연아 

200014005 

Houdini

손나은 

200017055 

C++ 


테이블

- 표 자체를 말함.

테이블은 필드들과 레코드들로 구성된 구성 요소인데 하나의 데이터베이스 테이블 내에 필드들과 레코드들이 존재하게 되는 것이다.

필드

- 이름, 학번, 수강과목을 나타내는 각각의 열(Column)을 '필드'라 부른다.

레코드

- 각 필드에 해당되는 첫 번째 사람의 데이터는 '김연아', '200014005', 'Houdini' 인데 하나의 행(Row)에 해당되는 데이터를 레코드라 한다.

즉, 레코드란 한 사람, 한 사람 분의 데이터를 의미한다. 


데이터베이스 관리 시스템(DBMS)

데이터베이스에 모아 놓은 데이터들의 저장, 읽기, 검색 등의 처리를 위해서는 전용 프로그램이 필요하게 되는데 이것을 데이터베이스 관리 시스템 즉, DBMS(Database Management System)라고 부른다.

DBMS는 사용자의 응용 프로그램과 데이터들의 저장소인 데이터베이스와의 연결을 도와주는 프로그램으로 생각하면 된다.

데이터베이스 프로그램인 MariaDB도 DBMS의 일종인데 이것 외에도 MSSLQ, Oracle, Infomix  등 많은 DBMS가 있다. MariaDB(MySQL) 을 사용하기 위해서는 데이터베이스 전용 컴퓨터 언어가 필요한데 이를 SQL(Structured Query Language) 이라고 한다.

SQL은 데이터를 정의하고 조작, 제어할 수 있는 테이블 형태로 데이터를 저장하는 것을 관계형 데이터베이스라고 하는데, 관계형 데이터베이스에서 데이터를 조작, 관리하는데 필요한 언어가 바로 SQL이다.


MariaDB(MySQL) 의 특징

- MariaDB는 공개 소프트웨어이므로 누구나 무료로 다운로드 받아 사용할 수 있다. 그러나 상업적인 목적으로 MariaDB를 사용하려면 라이센스를 별도로 구매하여 사용하여야 한다.

- MariaDB는 DBMS 중에서 처리 속도가 상당히 빠르다.

- MariaDB는 설치가 쉽고 사용하기 쉽기 때문에 초보자라도 빠른 시일 내에 사용법을 익힐 수 있다.

- MariaDB는 대용량의 데이터를 처리할 수 있으며, 데이터 용량이 아무리 커도 손쉽게 처리할 수 있다.

- 보안성이 뛰어나다.


설치법

http://saelly.tistory.com/552


'Programming > DataBase' 카테고리의 다른 글

keywork BETWEEN, IN  (0) 2016.08.15
Basic  (0) 2016.07.31
SQL 데이터 조작문 - 데이터 삽입  (0) 2014.09.08
SQL 데이터 조작문 - 데이터 갱신  (0) 2014.09.08
SQL 데이터 조작문 - 데이터 검색  (0) 2014.09.07
Posted by scii
:


OS : Centos 7


1. Install Apache on a CentOS 7

: 아파치 서버를 설치한다.

# yum install httpd

output : 

Loaded plugins: amazon-id, rhui-lb

Resolving Dependencies

--> Running transaction check

---> Package httpd.x86_64 0:2.4.6-17.el7 will be installed

--> Processing Dependency: httpd-tools = 2.4.6-17.el7 for package: httpd-2.4.6-17.el7.x86_64

--> Processing Dependency: /etc/mime.types for package: httpd-2.4.6-17.el7.x86_64

--> Running transaction check

---> Package httpd-tools.x86_64 0:2.4.6-17.el7 will be installed

---> Package mailcap.noarch 0:2.1.41-2.el7 will be installed

--> Finished Dependency Resolution

 

Dependencies Resolved

 

======================================================================================================

 Package            Arch          Version               Repository                               Size

======================================================================================================

Installing:

 httpd              x86_64        2.4.6-17.el7          rhui-REGION-rhel-server-releases        1.2 M

Installing for dependencies:

 httpd-tools        x86_64        2.4.6-17.el7          rhui-REGION-rhel-server-releases         77 k

 mailcap            noarch        2.1.41-2.el7          rhui-REGION-rhel-server-releases         31 k

 

Transaction Summary

======================================================================================================

Install  1 Package (+2 Dependent packages)

 

Total download size: 1.3 M

Installed size: 3.9 M

Is this ok [y/d/N]: y

Downloading packages:

(1/3): httpd-tools-2.4.6-17.el7.x86_64.rpm                                     |  77 kB  00:00:00

(2/3): httpd-2.4.6-17.el7.x86_64.rpm                                           | 1.2 MB  00:00:00

(3/3): mailcap-2.1.41-2.el7.noarch.rpm                                         |  31 kB  00:00:00

------------------------------------------------------------------------------------------------------

Total                                                                 2.0 MB/s | 1.3 MB  00:00:00

Running transaction check

Running transaction test

Transaction test succeeded

Running transaction

  Installing : httpd-tools-2.4.6-17.el7.x86_64                                                    1/3

  Installing : mailcap-2.1.41-2.el7.noarch                                                        2/3

  Installing : httpd-2.4.6-17.el7.x86_64                                                          3/3

  Verifying  : mailcap-2.1.41-2.el7.noarch                                                        1/3

  Verifying  : httpd-tools-2.4.6-17.el7.x86_64                                                    2/3

  Verifying  : httpd-2.4.6-17.el7.x86_64                                                          3/3

 

Installed:

  httpd.x86_64 0:2.4.6-17.el7

 

Dependency Installed:

  httpd-tools.x86_64 0:2.4.6-17.el7                   mailcap.noarch 0:2.1.41-2.el7

 

Complete!


: httpd 서비스를 활성화 및 부팅시에 자동적으로 활성화가 되도록 한다.

# systemctl enable httpd.service

output : 

ln -s '/usr/lib/systemd/system/httpd.service' '/etc/systemd/system/multi-user.target.wants/httpd.service'


# systemctl disable httpd.service 

- disable 명령을 하면 httpd 서비스가 중단되고 부팅하여도 활성화되지 않는다.


: httpd service 실행

# systemctl start httpd.service 

ex) systemctl {start | stop | restart } httpd.service - 시작, 중지, 재시작 명령

ex) systemctl is-active httpd.service - httpd 서버의 상태 확인 명령

apache server가 잘 동작하는지 확인하려면 127.0.0.1을 쳐봐서 확인할 수 있다.



: Gracefully 재시작

# apachectl graceful


: Test httpd/apache configuration file for errors on a centos

# apachectl configtest

- 아파치 서버의 설정파일 테스트인데 "syntax ok"가 나와서 정상이다.

하지만 아마도 처음 이것을 실행하면 서버네임 어쩌고저쩌고 에러가 나올 수 있다. 나중에 설정할 것이지만 미리 말하면 /etc/httpd/conf/httpd.conf  에서...

ServerName 127.0.0.1:80 으로 편집하면 에러가 나지 않을 것이다.


: httpd service default configuration

1. Default config file : /etc/httpd/conf/httpd.conf

2. configuration files which load modules : /etc/httpd/conf.modules.d/directory(e.g PHP)

3. Seelct MPMs (processing model) as loadable modules [worker, prefork(default)] and event:

/etc/httpd/conf.modules.d/00-mpm.conf

4. Default ports : 80 and 443(SSL)

5. Default log files : /var/log/httpd/}access_log, error_log}


***************************************************************************************************************

***************************************************************************************************************


2. MariaDB Install

: mariadb를 설치한다.

# yum install mariadb-server mariadb


: mariadb start

# systemctl start mariadb.service

이 명령을 실행 시켰을 때, error가 발생한다면... 제대로 설치가 되지 않은 것이다.

/var/lib/mysql 디렉토리를 지우고 다시 만든다. mkdir /var/lib/mysql

그런 다음, 

yum install mariadb mariadb-server

다시 한번 이 명령을 실행시키면 된다.



: 컴퓨터 켤 때 자동 실행

# systemctl enable mariadb.service

output :

ln -s '/usr/lib/systemd/system/mariadb.service' '/etc/systemd/system/multi-user.target.wants/mariadb.service


ex)

sudo systemctl stop mariadb.service #<-- Stop mariadb server

sudo systemctl restart mariadb.service #<-- Restart mariadb server

sudo systemctl disable mariadb.service #<-- Disable mariadb server

sudo systemctl is-active mariadb.service   #<-- Is mariadb server running?


: Securing MariaDB

# /usr/bin/mysql_secure_installation

output :

NOTE: RUNNING ALL PARTS OF THIS SCRIPT IS RECOMMENDED FOR ALL MariaDB

      SERVERS IN PRODUCTION USE!  PLEASE READ EACH STEP CAREFULLY!

In order to log into MariaDB to secure it, we'll need the current

password for the root user.  If you've just installed MariaDB, and

you haven't set the root password yet, the password will be blank,

so you should just press enter here.

Enter current password for root (enter for none): PRESS-ENTER-KEY

OK, successfully used password, moving on...

Setting the root password ensures that nobody can log into the MariaDB

root user without the proper authorisation.

Set root password? [Y/n] Y

New password: YOUR-NEW-PASSWORD-HERE

Re-enter new password: YOUR-NEW-PASSWORD-HERE

Password updated successfully!

Reloading privilege tables..

 ... Success!

By default, a MariaDB installation has an anonymous user, allowing anyone

to log into MariaDB without having to have a user account created for

them.  This is intended only for testing, and to make the installation

go a bit smoother.  You should remove them before moving into a

production environment.

Remove anonymous users? [Y/n] Y

 ... Success!

Normally, root should only be allowed to connect from 'localhost'.  This

ensures that someone cannot guess at the root password from the network.

Disallow root login remotely? [Y/n] Y

 ... Success!

By default, MariaDB comes with a database named 'test' that anyone can

access.  This is also intended only for testing, and should be removed

before moving into a production environment.

Remove test database and access to it? [Y/n] Y

 - Dropping test database...

 ... Success!

 - Removing privileges on test database...

 ... Success!

Reloading the privilege tables will ensure that all changes made so far

will take effect immediately.

Reload privilege tables now? [Y/n] Y

 ... Success!

Cleaning up...

All done!  If you've completed all of the above steps, your MariaDB

installation should now be secure.

Thanks for using MariaDB!


:: 잘 설치되었는지 확인

# mysql -u root -p

위의 명령을 입력하여 비밀번호를 치고 들어가면 성공.


: mariaDB 가 잘 동작하는 지 확인

vi /var/www/html/db.php

 code :

<?php

mysql_connect("", "", "");

echo "db 작동 완료!!";

?>

이렇게 해서 "db 작동 완료" 라는 문구가 나오면 서로 잘 연동 된 것이다.


3. PHP Install

: php 설치

# yum install php php-mysql php-gd php-pear


: httpd 재시작

# systemctl restart httpd.service


:  모듈 설치

# yum install php-pgsql


: php가 잘 설치되었는지 확인

vi /var/www/html/test.php

code : 

<?php

phpinfo();

?>

파일을 저장하고 웹브라우저에서 127.0.0.1/text.php 를 입력하면 아래의 사진과 같은 결과물이 나오면 잘 설치가 된 것이다.




====================================================================================================


Configure Settings


:: 방화벽 설정

\

3306 포트는 mariadbServer에서 mysql를 열기위함이다. mysql 기본 포트가 3306인 것 같다.


방화벽 서비스 재시작



/etc/httpd/conf/httpd.conf

: apache가 php를 인식하도록 설정



/etc/httpd/conf.d/php.conf

:: AddType 추가


:: DirectoryIndex 추가



/etc/php.ini

upload_max_filesize = 100M

default_socket_timeout = 3000

max_execution_time = 30     ; Maximum execution time of each script, in seconds

max_input_time = 60     ; Maximum amount of time each script may spend parsing request data

memory_limit = 128M      ; Maximum amount of memory a script may consume

short_open_tag = On // XE 가  제대로 작동 안될때 사용.

 upload_tmp_dir = /tmp

upload_max_filesize = 100M

default_charset = "UTF-8"

mbstring.internal_encoding = UTF-8


# php.ini 에서 사용 금지할 명령어 추가

disable_functions = exec, shell



/etc/my.cnf

php에서 한글을 출력해 내는 것은 잘 되는데, MariaDB에서 DB 쿼리를 해서 한글을 출력시에는 전부 ?? 로 표시되는 문제가 발생했다.

인터넷상에서 알려진 PHP와 UTF-8의 설정법을 전부 적용해봤는데도 안되었는데, 최종적으로 /etc/my.cnf 에 [mysqld] 항목에서 skip-character-set-client-handshake 를 추가해주니깐 겨우 한글이 출력되기 시작했다. 클라이언트의 설정을 무시하고 서버쪽 설정에 따르도록 한다는 것 같다.

다른 부분을 전부 설정했음에도 저걸 안해주면 안되는 이유가 소스 설치를 했으면 모르겠는데, 내 경우는 yum 을 이용해서 설치했으며, yum 을 이용해서 설치하면 다른곳이 전부 utf8이라도 DB가 접속시 latin을 사용한다는 얘기가 있다. 따라서 꼭 skip-character-set-client-handshake 를 해준다.

이외에 기본적으로 CentOS 6.4에서 PHP와 MariaDB(MySQL)의 utf-8 입출력을 위한 설정을 남겨본다.

물론 기본적으로 php 파일은 utf-8 로 인코딩 되어 있어야 함.

1. DB 생성시 utf8_general_ci 로 생성.

2. /etc/my.cnf 파일 수정

※ 참고로 my.cnf 설정 잘못하면 my.cnf 설정 변경후 서비스 재시작시에 에러나서 실행이 안될수도 있다. 이 경우엔 설정을 하나씩 지우던가 해서 맞지 않는 설정을 제외시킨다.


[client]

default-character-set=utf8


[mysqld]

init_connect="SET collation_connection=utf8_general_ci"

init_connect="SET NAMES utf8"

character-set-server=utf8

collation-server=utf8_general_ci

skip-character-set-client-handshake


[mysql]

default-character-set=utf8

#

# This group is read both both by the client and the server

# use it for options that affect everything

#

[client-server]

#

# include all files from the config directory

#

!includedir /etc/my.cnf.d


위와같이 my.cnf 를 바꿔준후 서비스를 재시작해주고 mysql 콘솔로 접속해서 show variables like 'c%'; 명령어를 이용해서 정상적으로 db가 utf8로 설정되어 있는지 확인한다.


:: /etc/php.ini 수정

default_charset = "utf-8"

mbstring.internal_encoding=UTF-8


일단 내가 설정한 부분은 여기까지 였으며 정확하게 utf-8이 동작한다. 내 경우에 핵심은 /etc/my.cnf 에 skip-character-set-client-handshake 추가를 해준후에 동작했다는 점. 



참고 페이지 : 

http://blog.keypointer.co.kr/?p=53

http://www.cyberciti.biz/faq/howto-install-linux-apache-mariadb-php-lamp-stack-on-centos7-rhel7/

http://www.if-not-true-then-false.com/2013/install-mariadb-on-fedora-centos-rhel/

http://www.nextstep.co.kr/250



'Programming > etc' 카테고리의 다른 글

Linux PHPStrom 설정  (0) 2014.09.06
Installing Xdebug on CentOS  (0) 2014.09.06
Python 학습 관련 자료 및 문서, WebSite  (0) 2014.03.25
Python PySide 설치  (1) 2013.03.07
윈도우환경을 리눅스환경처럼  (0) 2013.02.19
Posted by scii
: