mysql, mariadb 에서 테이블 상세 정보를 확인해야 할 때 사용하는 명령어

 

간락한 테이블 정보를 보여준다.

desc 테이블명;

 

 MariaDB [dbname]> DESC account;
+-------------------+-------------+------+-----+---------+----------------+
| Field                 | Type         | Null   | Key | Default | Extra              |
+-------------------+-------------+------+-----+---------+----------------+
| account_no        | int(11)        | NO   | PRI | NULL    | auto_increment |
| year                 | int(11)        | NO   |        | 0        |                     |
| month              | tinyint(4)     | NO   |        | 0        |                     |
| code                | varchar(20)  | NO   | MUL | NULL    |                    |
| user_id             | varchar(20)  | NO   | MUL | NULL    |                    |
| reg_dt              | datetime     | NO   |        | NULL    |                   |
| status               | char(1)       | NO   |        | 0         |                    |
+-------------------+-------------+------+-----+---------+----------------+
7 rows in set (0.01 sec)

쉘에서 실제 명령을 입력하면 위와 같이 텍스트로 나옵니다.

웹상에서는 공백 문제로 알아보기 힘드니 이미지로 다시 보면 밑과 같습니다.

 

 

desc 와 또 다른 명령으로 show columns 를 사용해도 결과는 동일합니다.

show columns from 테이블;

 

 

 

간단하게 보여주는것은 좋은데 컬럼에 대한 주석이나 캐릭터셋 정보가 빠져 있죠

좀더 자세히 보려고면 show full columns 를 사용합니다.

show full columns from 테이블;

 

 

 

이외에도 스카마를 이용하는 방법이 있는데 개발하면서 그정도 까지 볼일은 거의 없으니 생략합니다.

요즘은 DB 캐릭터셋을 국내에서만 사용할 것이 아니라면 대부분 utf-8로 설정합니다.

그런데 간혹 윈도우에서 작업하거나 덤프한  쿼리문을 인서트 시켜야 할 때가 있습니다.

이때 서버의 캐릭터셋과 달라서 한글이 깨지는 경우가 있는데 캐릭터셋을 맞춰서 넣어줘야 겠죠!



파일 저장형식은 euc-kr (윈도우 텍스트 파일) 이고 DB 는 utf-8  일때  mysql 버전에 따라 인서트 안됨


아래 멍령어로 DB insert

mysql --default-character-set=euckr -u 아이디 -p 디비명 < 쿼리파일명
예) mysql --default-character-set=euckr -u test -p testDB < test_query.sql


간혹 mysql 버전에 따라  --default-character-set 옵션이 동작하지 않아 한글이 깨지는 경우가 있습니다.

이때는 다음 처럼 쿼리 파일을 수정합니다.

test_query.sql 파일 상단에 다음 처럼 서버 설정에 맞는 캐릭터셋 추가 후 insert


set names utf8;

set names euckr;



다른 캐릭터셋 명령도 볼까요!


set names utf8

set session character_set_connection=utf8

set session character_set_results=utf8

set session character_set_client=utf8


각 언어에서 character set 지정은 아래 처럼하면 되겠죠! (아래 예는 php)


mysql_query("set names utf8", $db);

mysql_query("set session character_set_connection=utf8", $db);

mysql_query("set session character_set_results=utf8", $db);

mysql_query("set session character_set_client=utf8", $db);


mysql innodb엔진은 4.x부터는 mysql설치시 기본적으로 탑재되어 있었으나
5.1.3x부터는 기존 configure 옵션되로 하면 기본적으로 innodb가 탑재가 안되며
configure옵션에 --with-plugins=innobase 또는 --with-plugins=max 옵션을 추가해줘야 한다.


 

innodb부분이 YES로 나와있어야함.
mysql> show variables like 'have_innodb';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| have_innodb   | YES   |
+---------------+-------+
1 row in set (0.00 sec)

 

myisam에서 innodb로 변경
ALTER TABLE 테이블명 ENGINE=INNODB
ALTER TABLE 테이블명 TYPE=INNODB

 

innodb테이블생성시
create table a(a int not null, b int) engine=innodb    (engine=inodb옵션이 붙어야함)

 

트랜잭션 사용

start transaction;
insert into test1 values (11);
insert into test2 values (21);
commit; 

MySql 에서 날짜를 표현하고 변환하는 date_format() 에 대해서 알아봅시다.
워낙 기초적인것이고 초보자를 위해 상세하게 설명하는 글이 아니라 옵션 설명을 자꾸 까먹어서 기록용으로 남기는 거니 간단하게 설명하고 넘어 갑니다.

블로그 전체가 오른쪽 마우스 사용 제한이 걸려있으니 소스를 복사할 분은 검은 배경의 소스창 오른쪽 상단의 "source view" 를 눌러서 복사하면 됩니다.

date_format(date, format) 은 date를 새로운 날짜 format으로 반환하는 함수 입니다.

한국에서 가장 많이 사용하는 날짜 형식(년-월-일 시:분:초)은 다음과 같이 하면 된다.

mysql> SELECT date_format(now(),'%Y-%m-%d %I:%i:%s')



format 사용하는 인자를 아래를 적어 놓으니 참고 바랍니다
%M : 달의 이름 (January... December)
%W : 주의 이름(Sunday,..... Saturday)
%D : 1st, 2nd 등을 이용한 달을 표현함
%Y : 4개의 숫자를 이용한 연도 (예, 1999,2000,2001)
%y : 2개의 숫자를 이용한 연도 (예, 99,00,01)
%X : %V와 함께 쓰여 연도를 나타냄
%x : %v와 함께 쓰여 연도를 나타냄
%a : Sun, Sat과 같은 요일을 나타냄
%d : 00, 01......31등의 날짜를 표현함
%e : 0,1,2,.....31등의 날짜를 푠현함
%m : 01,02...12 등의 달을 표현함
%c : 1,2,....12등의 달을 표현함
%b : Jan, Dec 같은 방법으로 달을 표현함
%j : 001,002,003... 366 과 같이 날짜를 표현함(올해의 몇번째 날인가)
%H : 00,01,02...23 과 같이 시를 표현
%h : 01,02...12와 같이 시를 표현
%I(대문자 아이) : 01,02...12와 같이 시를 표현
%l(소문자 엘) : 1,2...12와 같이 시를 표현
%i : 00,01.....59 와 같이 분을 표현함
%r : 시간을 12시로 "hh:mm:ss AM|PM" 형식으로 표현
%T : 시간을 24시로 "hh:mm:ss"형식으로 표현
%S : 00,01,....59 형식으로 초를 표현
%s : 00,01,...59 형식으로 초를 표현
%p : AM 혹은 PM
%w : 0,1,......6 형식으로 요일을 표현 (0은 일요일, 1은 월요일 6은 토요일)
%U : 주를 0,1,...53 식으로 표현(일요일이 주의 시작인 경우)
%u : 주를 0,1,...53 식으로 표현(월요일이 주의 시작인 경우)
%V : 주를 0,1,...53 식으로 표현(일요일이 주의 시작인 경우), %X와 함께 쓰임
%v : 주를 0,1,...53 식으로 표현(월요일이 주의 시작인 경우), %x와 함께 쓰임
%% : %자체를 표현



Ex) 실제 쿼리에서 사용하는 방법이다.
//now()는 현재날짜와 시간을 반환하는 함수

mysql > SELECT date_format(now(), '%W %M %Y');

//결과는 다음과 같다
+-------------------------------+
| date_format(now(),'%W %M %Y') |
+-------------------------------+
| Sunday December 2001 |
+-------------------------------+
1 row in set (0.00 sec)



// 날짜 붙여서 가져오기
mysql > SELECT date_format(now(),'%Y%m%d%I%i%s')



테이블에 있는 컬럼명 reg_date 의 날짜를 가져와서 변환 할 수 도 있습니다.
SELECT FROM_UNIXTIME( reg_date, '%Y-%m-%d' ) FROM `테이블명`




1. euc-kr로 덤프한 파일을 utf-8 디비에 넣을때 명령어


root > mysql --default-character-set=euckr -u 아이디 -p 디비명 < dump_file.sql

> 암호입력




2. dump 파일은 euc-kr 이고 DB utf-8 일때  mysql 버전에 따라 --default-character-set 옵션이 동작하지 않아 insert 가 안되거나 한글이 깨져서 입력될 경우


dump_file.sql 파일을 열어서 상단에 다음 추가 하고 다시해보자.


root > vi dump_file.sql


첫줄에 다음 내용 추가 후 저장

set names utf8;





root > mysql --default-character-set=euckr -u 아이디 -p 디비명 < dump_file.sql

> 암호입력





3. 호스팅을 받고 있어서 mysql 설정을 직접 바꿀 수 없는경우 character set을 바꾸려면 컨넥션 후 다음 쿼리를 날려주자

이런 경우는 호스팅 서비스를 이전하는것도 방법이지만 버전차이로 인해서 오류가 발생 할 수 있으니 미리 체크하자 


set names utf8

set session character_set_connection=utf8

set session character_set_results=utf8

set session character_set_client=utf8



PHP 기준으로 설명하면 다음과 같다.



mysql_query("set names utf8", $db);

mysql_query("set session character_set_connection=utf8", $db);

mysql_query("set session character_set_results=utf8", $db);

mysql_query("set session character_set_client=utf8", $db);



항상 세팅 부분은 어쩌다 한번씩 하다 보니 자꾸 까먹게 되어서 10년 넘게 따로 문서에 기록해뒀었는데 이젠 문서 찾기도 귀찮아서 블로그에 남김니다.

mysql 계정 생성 하기

1. 사용할 DB를 생성합니다.
   CREATE DATABASE 디비명;


"testdb" 라는 이름의 데이터베이스를 생성 합니다.
mysql> CREATE DATABASE testdb;


2. 사용할 계정을 생성합니다.
mysql> GRANT ALL PRIVILEGES ON [DB명].[테이블명(*)] TO [유저명]@[서버명] IDENTIFIED BY '[암호]' WITH GRANT OPTION;


데이터베이스명 : testdb
계정 이름: userid
게정 비밀번호: userpwd

접속을 localhost 에서만 허용하고 싶으면 다음 처럼 입력 합니다.
mysql> GRANT ALL PRIVILEGES ON testdb.* TO `userid`@`localhost` IDENTIFIED BY 'userpwd' WITH GRANT OPTION;


접속을 localhost 외 모두 허용하려면 "유저명@`%`" 를 추가 해야 합니다.
mysql> GRANT ALL PRIVILEGES ON testdb.* TO `userid`@`%` IDENTIFIED BY 'userpwd' WITH GRANT OPTION;


간혹 리눅스 서버에서 /etc/hostname 에 도메인명 (예: "mydomain.com")이 지정되어 있는 경우 localhost 에서 접속이 안됩니다.
이때는 접속해야할 서버에 hostname 을 지정하여 "유저명@`mydomain.com`" 를 추가 해야 합니다.
mysql> GRANT ALL PRIVILEGES ON testdb.* TO `userid`@`mydomain.com` IDENTIFIED BY 'userpwd' WITH GRANT OPTION;


3. 계정 설정까지 다 되었으면 새로운 계정을 사용할 수 있도록 합니다.
mysql> FLUSH PRIVILEGES;


4. 예전 방식의 암호화를 사용할 경우 암호를 예전 방식으로 저장합니다.
mysql> use mysql;
                                 
mysql> update user set password=password('비밀번호') where user='userid';

mysql> FLUSH PRIVILEGES;


5. mysql 5.5 이상일때 위에 것이 안될 수 있습니다. 그때는 다음과 같이 사용합니다.
접속을 localhost 에서만 허용하고 싶으면 다음 처럼 입력 합니다.
insert into user (host, user, password, ssl_cipher, x509_issuer, x509_subject, authentication_string) values ('localhost', '아이디', password('비밀번호'), '',  '', '', '');

insert into db (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) values ('localhost','디비명','아이디', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y' );


접속을 localhost 외 모두 허용하려면 "유저명@%" 를 추가 해야 합니다.
insert into user (host, user, password, ssl_cipher, x509_issuer, x509_subject, authentication_string) values ('%', '아이디', password('비밀번호'), '',  '', '', '');

insert into db (host, db, user, select_priv, insert_priv, update_priv, delete_priv, create_priv, drop_priv, grant_priv, references_priv, index_priv, alter_priv) values ('%','디비명','아이디', 'Y','Y','Y','Y','Y','Y','Y','Y','Y','Y' );

+ Recent posts