데이타 임포트시 한글 깨짐문제 - 캐릭터셋 설정

리눅스/MySQL|2015. 1. 16. 10:44
반응형

[문제]
1. 엑셀로 모든 데이타를 준비해두었다.
2. mysql dataktma폴더에 csv파일로 저장을 했다.
3. csv파일과 동일한 구조의 member테이블도 만들어 두었다.
4. load data infile 'member.csv' into table member fields terminated by ',';
5. 임포트는 잘되었는데 select로 긁어보면 한글이 깨져보인다...


[해결]
1. 벨 짓 다 해본다.
2. 엑셀에서 내보낼때 dbf 형식으로 내보낸다. -> 그래도 안된다.
3. MyDB 툴을 써서 임포트 해본다. -> 이래도 안된다.
4. SQLGate에서 임포트 해본다(엑셀 그대로,csv형태로,ddbf형태로) -> 이래도 안된다
5. 혹시나 싶어 울트라에디트에서 끝줄 공백 없애본다. -> 소용없이 안된다.
6. character set 변수를 확인해본다(my.ini파일) -> 이상없이 "euckr"로 설정돼 있다.
7. 데이타베이스 사랑넷(database.sarang.net)에서 한글깨짐 검색을 해본다.
8. 마침내 의미 있는 정보를 얻는다. 
( show variables명령어를 통해서 보니까 character set 관련 변수가 굉장히 많은게 아닌가?
- character_set_client : euckr
- character_set_connection : latin1
- character_set_database : latin1
- character_set_results : euckr
- character_set_server : latin1


하여간 보니깐 위 처럼 중간중간 "latin1"이라는 캐릭터셋이 설정돼 있는게 아닌가?
바로 저거다 싶어서 어떻게 저것들을 바꿀 수 있는지 검색한다.

9. alter database명령어로 바꿀 수 있음을 알게 된다.
10. alter database ktma default character set euckr;
이상하게 위 명령어는 안먹힌다. 따라서 변수별로 아래 명령어를 날려준다.

mysql> SET character_set_client = euckr;
mysql> SET character_set_results = euckr;
mysql> SET character_set_connection = euckr;
명령어를 때린다.
11. 엑셀에서 csv파일로 저장한다.
12. load data infile 'member.csv' into table member fields terminated by ',';
명령어를 때린다.
13. 결과를 확인한다....빠샤빠샤~ 됐다...됐어...그럼 그렇지 짜식~ 지가 안되고 배겨??ㅋㅋㅋ

[ 06-08-23 추가 ]
처음 xp에 mysql을 설치할때 캐릭터셋에 관해서는 환경설정 시에 "euckr"을 기본으로 설정해서 설치했다.
그런데 도스창에서 실행해보면 이상하게도 디폴트로 "latin1"이 설정이 되는게 아닌가?

C:>mysql -u chang -p kimchpekr 하고 로긴한 후에
mysql>show variables like 'character%'; 명령어로 환경변수를 보면....
여러가지 캐릭터 셋이 "latin1"으로 설정이 되는게 아닌가?

이 상태에서
mysql>set character_set_connection=euckr;  명령어를 통해 캐릭터셋을 변경하면 세션 중에만 반영이 되고, 로그아웃 후에 다시 들어와보면 처음과 같이 된다.

결국 캐릭터셋을 바꾸는 set명령은 세션 생성할때마다 해주어야 하는 번거로운 절차가 아닐 수 없다.
다만, 클라이언트로 접속하기 전 명령줄에 아래와 같이 하면 로긴 후에 5개 정도의 set명령을 한 번으로 줄일 수는 있다.

C:>mysql -u chang -p kimchpekr --default-character-set=euckr --skip-character-set-client-handshake

그렇다면 sql데이타를 임포트하는 경우 한글이 깨진다면 아래와 같이 생각해야 한다...
생성된 sql 파일의 캐릭터셋과 집어 넣고자 하는 mysql서버 캐릭터셋이 다르기때문에 그런 문제가 생기는 것이다.

이 문제는 이렇게 해결할 수 있다.

C:>mysql -u chang -p kimchpekr < backup.sql 로 명령해서 한글이 깨진다면....

C:>mysql -u chang -p kimchpekr --default-character-set=euckr < backup.sql 이 명령으로 해결할 수 있다.

즉, 임포트시에 euckr로 캐릭터셋을 맞추고 집어 넣으면 된다.

[ 06-11-24 추가 ]
위와 같은 방법으로 해도 에러가 난다. 그래서 다른 방법으로 해봤다.

1. 덤프할때의 절차가 중요하다.
기존에는 호스팅 회사에서 제공해주는 phpmyadmin을 통해서 sql파일을 만들어 저장하고, 옮길 서버로 업로드 시키고, ssh쉘을 통해서 임포트 명령을 주는 절차를 따랐는데

2. 이번에는 모든 작업을 ssh쉘에서 진행해봐싸.
ssh쉘에서 덤프 명령을 통해 sql파일을 만든다. 그 파일을 임포트 할 디비가 있는 서버로 옮긴 뒤 역시 ssh쉘을 통해 임포트할 서버로 로그인 한 뒤에 그 안에서 임포트 명령을 했다.

이랬더니 한글 깨짐 현상이 없더군...ㅠ.ㅠ


출처 : http://www.localhost.co.kr/v4/bbs/board.php?bo_table=DB_3_MYSQL&wr_id=8

반응형

댓글()

캐릭터셋(CharSet) 변경

리눅스/MySQL|2015. 1. 16. 10:43
반응형

캐릭터 셋 utf-8 에서 euckr 로 바꾸는 예제

1) 확인
mysql> show variables like 'c%';

+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | utf8                                   |  <- 변경
| character_set_connection | utf8                                   |  <- 변경
| character_set_database   | utf8                                   |  <- 변경
| character_set_filesystem | binary                                 |
| character_set_results    | utf8                                   |  <- 변경
| character_set_server     | utf8                                   |  <- 변경
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | utf8_general_ci                        |  <- 변경
| collation_database       | utf8_general_ci                        |  <- 변경
| collation_server         | utf8_general_ci                        |  <- 변경
| completion_type          | 0                                      |
| concurrent_insert        | 1                                      |
| connect_timeout          | 5                                      |
+--------------------------+----------------------------------------+


2) 변경 (일시적인 방법. MySQL을 재시작 하면 원래 값으로 돌아간다.)
msyql> set character_set_client = euckr;
msyql> set character_set_connection = euckr;
msyql> set character_set_database = euckr;
msyql> set character_set_results = euckr;
msyql> set character_set_server = euckr;
mysql> set collation_connection = euckr_korean_ci;
mysql> set collation_database = euckr_korean_ci;
mysql> set collation_server = euckr_korean_ci;

3) 확인
mysql> show variables like 'c%';
+--------------------------+----------------------------------------+
| Variable_name            | Value                                  |
+--------------------------+----------------------------------------+
| character_set_client     | euckr                                  |
| character_set_connection | euckr                                  |
| character_set_database   | euckr                                  |
| character_set_filesystem | binary                                 |
| character_set_results    | euckr                                  |
| character_set_server     | euckr                                  |
| character_set_system     | utf8                                   |
| character_sets_dir       | /usr/local/mysql/share/mysql/charsets/ |
| collation_connection     | euckr_korean_ci                        |
| collation_database       | euckr_korean_ci                        |
| collation_server         | euckr_korean_ci                        |
| completion_type          | 0                                      |
| concurrent_insert        | 1                                      |
| connect_timeout          | 5                                      |
+--------------------------+----------------------------------------+


4) 변경2 (온전한 변경 방법)

/etc/my.cnf 파일을 변경 해줍니다.

[client] 
default-character-set=euckr 

[mysqld] 
default-character-set=euckr        // 이 옵션은 5.5 버전에서 적용되지 않으므로 빼시기 바랍니다.
init_connect=SET collation_connection=euckr_korean_ci 
init_connect=SET NAMES euckr 
character-set-server=euckr 
collation-server=euckr_korean_ci 

[mysqldump] 
default-character-set=euckr 

[mysql] 
default-character-set=euckr 

추가 및 변경 후, MySQL 을 재시작 해주어야 적용된다.


5) 아파치 캐릭터셋 확인

/usr/local/apache/conf/httpd.conf 파일을 변경(내용 추가)해줍니다.

AddDefaultCharset euckr


※ 참고1 : UTF-8사용 : AddDefaultCharset UTF-8
    참고2 : Apache 버젼 2.2.6 이상의 경우, /usr/local/apache/conf/extra/httpd-languages.conf 를 수정.

추가 및 변경 후, Apache 를 재시작 해주어야 적용된다.

 

 

[참고]

5.0 버전에서 확인한 결과 my.cnf에서 아래 세군데만 바꿔도 변경(또는 등록) 가능했습니다.

[client]
default-character-set=euckr

[mysqld]
default-character-set=euckr

[mysql]
default-character-set=euckr



반응형

댓글()

mysql 에서 트랜젝션 걸기 (이노디비 사용)

리눅스/MySQL|2015. 1. 16. 10:43
반응형

(기본 예제)
SET AUTOCOMMIT=0;
BEGIN;

...... query;

COMMIT;
ROLLBACK;

위의 예제를 사용하시려면 table 이 innodb 타입으로 되어 있어야 합니다.

참고1) innodb 타입으로 생성하려면...
create table table_name
(
......
)type=innode;

참고2)  innodb는 기본족으로 MySQL 4.0 이후 버전부터 지원하며,
              지원여부를 알고 싶으시면...

mysql> show variables like 'have_%' 라고 치신 후

have_innode=YES 라고 나오면 innodb가 사용 가능한 MySQL 입니다.

참고3) 4.0 이후 버전인데도 innodb를 사용못하게 설정 되어 있다면
            my.ini 파일에서...

[mysqld]
innodb_data_file_path = ibdata1:10M:autoextend
set-variable = innodb_buffer_pool_size=70M
set-variable = innodb_additional_mem_pool_size=10M
set-variable = innodb_log_file_size=20M
set-variable = innodb_log_buffer_size=8M
innodb_flush_log_at_trx_commit=1


저장할 파일명과 크기, 버퍼 크기, 로그 파일 크기 등이 나와 있습니다.
원하는 크기로 설정, 저장을 하고 mysql을 재시작 하면 됩니다.

반응형

댓글()

max_connection 늘리기

리눅스/MySQL|2015. 1. 16. 10:43
반응형

변경 방법

1) /etc/my.cnf 내에 아래와 같은 옵션 추가..

[mysqld]
max_connections = 1024

위항목이 없으면, set-variable = max_connections=300

mysql 재시작.


임시 변경 방법

// 데몬을 죽인다.
# mysqladmin -u root -p shutdown
or
# killall mysqld

// mysqld 데몬을 띄우면서 max_connection 을 명시한다.
# mysqld_safe -O max_connections=200 & 


확인 방법

# mysqladmin -u root -p variables | grep max_connection
   password:

반응형

댓글()

MySQL 백업 및 복구

리눅스/MySQL|2015. 1. 16. 10:42
반응형

백업하기
1) DB별로 백업
mysqldump -u root -p DB명 > 파일명.sql
암호입력 (Enter)

2) 전체 백업
mysqldump -u root -p --all-databases > 파일명.sql
암호입력 (Enter)

3) 캐릭터셋 옵션을 이용하여 백업
mysqldump -u root -p --default-character-set=euckr DB명 > 파일명.sql
암호입력 (Enter)
(euckr, utf8 등이 있음)

4) 특정 테이블만 덤프
mysqldump -u root -p DB명 테이블명 > 파일명.sql
mysqldump -u root -p -B DB명 --tables 테이블명1 테이블명2 테이블명3 > 파일명.sql

5) 테이블 구조만 백업

mysqldump -u root -p --no-data DB명 > 파일명.sql

 

6) XML 파일로 백업

mysqldump -u root -p --xml DB명 > 파일명.sql



복구 하기
1) DB별로 복구
mysql -u root -p DB명 < 파일명.sql
암호입력 (Enter)

2) 전체 복구
mysql -u root -p < 파일명.sql
암호입력 (Enter)

3) 캐릭터셋 옵션을 이용하여 백업 복구
mysqldump -u root -p --default-character-set=euckr DB명 < 파일명.sql
암호입력 (Enter)
(euckr, utf8 등이 있음)

반응형

댓글()

db 생성, user 추가, 필드 값 삭제, update

리눅스/MySQL|2015. 1. 16. 10:42
반응형

데이터베이스 추가

create database 디비명;

 

mysql user 추가 
grant all privileges on 디비명.* to 유저명@localhost identified by '유저 패스워드';
flush privileges;

※ 아무곳에서나 원격으로 접속 가능하게 설정(또는 IP로 등록가능 / localhost 와 중복 사용 가능)
grant all privileges on 디비명.* to 유저명@'%' identified by '유저 패스워드';

 

password 변경
use mysql;
update user set password=password('새로운 패스워드') where user='유저명';
flush privileges;

 

필드 값 삭제 
delete from 테이블명 where 필드명='필드값';
예) 계정삭제
use mysql;
delete from user where user='삭제할 계정';

 

data 수정 (예: host 변경 localhost -> %)
use mysql;
update user set host='%' where user='system' and host='localhost';
flush privileges;

 

반응형

댓글()

MySQL 3.x -> 5.x 복구시 한글 깨짐 현상 해결

리눅스/MySQL|2015. 1. 16. 10:41
반응형

3.x 는 EUC-KR 이고

5.x 는 UTF-8 일때 일어나는 현상. UTF-8은 4.1x버젼부터 지원한다. (다국어)

덤프파일 풀때.... --default-character-set=euckr 라는 옵션으로 데이타 풀어버리면 된다.

예) mysql -u root -p [db명] --default-character-set=euckr < [db_dump명.sql]

반응형

'리눅스 > MySQL' 카테고리의 다른 글

mysql 에서 트랜젝션 걸기 (이노디비 사용)  (0) 2015.01.16
max_connection 늘리기  (0) 2015.01.16
MySQL 백업 및 복구  (0) 2015.01.16
db 생성, user 추가, 필드 값 삭제, update  (0) 2015.01.16
MySQL 패스워드 분실시  (0) 2015.01.16

댓글()

MySQL 패스워드 분실시

리눅스/MySQL|2015. 1. 16. 10:41
반응형

1. MySQL 데몬 실행 중지
root@sysdocu:~# /etc/rc.d/init.d/mysqld stop
(또는 # killall mysqld)

2.인증제외한 MySQL 데몬 실행
root@sysdocu:~# /usr/local/mysql/bin/mysqld_safe --skip-grant &

3. 비번없이 접속후 mysql DB의 user 테이블에서 root 패스워드 변경
root@sysdocu:~# /usr/local/mysql/bin/mysql -u root mysql
mysql> update user set password=password('new password') where user='root';
mysql> flush privileges;
mysql> quit

4. 정상적인 MySQL 데몬 실행
root@sysdocu:~# /usr/local/mysql/bin/mysqld_safe &

반응형

댓글()

php로 xinetd 데몬 만들기

리눅스/PHP|2015. 1. 16. 10:39
반응형

1. 서비스 등록

아래 파일을 열어 원하는 포트를 추가, 저장합니다.


root@sysdocu:~# vi /etc/services

nvr 8000/tcp # nvr 

nvr 8000/udp # nvr



2. 구동 데몬 추가

root@sysdocu:~# vi /etc/xinetd.d/nvr


service nvr

{

socket_type = stream

wait = no

user = root

server = /usr/local/php/bin/php

server_args = -f /root/nvr.php

log_on_success += HOST DURATION

log_on_failure += HOST

disable = no


* server 와 server_args 는 아래처럼 붙여서 실행된다고 보면 됩니다.

root@sysdocu:~# /usr/local/php/bin/php -f /root/nvr.php



3. 서비스 파일 만들기 (PHP)


root@sysdocu:~# vi /root/nvr.php

<?

echo "nice neulwon";

exit()        // telnet으로 테스트시 종료가 되지 않을 경우 추가해줍니다.

?> 



4. 실행

root@sysdocu:~# /etc/init.d/xinetd restart



5. 테스트

root@sysdocu:~# telnet localhost 8000


반응형

'리눅스 > PHP' 카테고리의 다른 글

php 7 에서 mysqli 추가시 오류  (0) 2018.07.15
php 설치시 만나는 각종에러  (0) 2016.12.12
socket 접속 테스트 소스  (0) 2015.01.16
ssh2 를 이용해 서버에 접속하기  (0) 2015.01.16
ChartDirector for PHP 오류  (0) 2015.01.16

댓글()

socket 접속 테스트 소스

리눅스/PHP|2015. 1. 16. 10:38
반응형
<?
define("_IP", "192.168.10.2");                                                                     // 접속하려는 서버 IP
define("_PORT", "555");                                                                                 // 접속하려는 서버 PORT
$socket = socket_create(AF_INET, SOCK_STREAM, SOL_TCP);    // 소켓 생성
$con = socket_connect($socket, _IP, _PORT);                                     // 소켓을 IP와 PORT에 결합
socket_write($socket, "msg\n");                                                               // 소켓 메세지 전송
socket_close($socket);                                                                                  // 소켓 닫기

if ($socket === false) {
    echo "socket_create() 실패! 이유: " . socket_strerror(socket_last_error()) . "\n";
} else {
    echo "socket 성공적으로 생성.\n";
}

if ($con === false) {
    echo "socket_connect() 실패.\nReason: ($result) " . socket_strerror(socket_last_error($socket)) . "\n";
} else {
    echo "다음 주소로 연결 성공 : $address.\n";
}
?>


반응형

'리눅스 > PHP' 카테고리의 다른 글

php 설치시 만나는 각종에러  (0) 2016.12.12
php로 xinetd 데몬 만들기  (0) 2015.01.16
ssh2 를 이용해 서버에 접속하기  (0) 2015.01.16
ChartDirector for PHP 오류  (0) 2015.01.16
PHP에서 SNMP 사용  (0) 2015.01.16

댓글()

ssh2 를 이용해 서버에 접속하기

리눅스/PHP|2015. 1. 16. 10:38
반응형
1. libssh2 설치
배포 사이트 : http://www.libssh2.org

root@sysdocu:~# cd /usr/local/src
root@sysdocu:~# tar xvzf libssh2-1.8.0.tar.gz
root@sysdocu:~# cd libssh2-1.8.0
root@sysdocu:~# ./configure
root@sysdocu:~# make
root@sysdocu:~# make install


2. ssh2 확장 모듈 설치
배포 사이트 : http://pecl.php.net
위 사이트에서 'Download Statistics' 링크를 따라가면 'Package Statistics' 에 ssh2 라는 것이 보입니다.

* 최신버전이 나왔습니다.
php 5.x 에서는 0.13, php 7 에서는 1.1.2 를 설치하세요. (2018.11.14 기준)

root@sysdocu:~# cd /usr/local/src
root@sysdocu:~# tar xvzf ssh2-1.1.2.tgz
root@sysdocu:~# cd ssh2-1.1.2
root@sysdocu:~# /usr/local/php/bin/phpize
root@sysdocu:~# ./configure --with-php-config=/usr/local/php/bin/php-config
root@sysdocu:~# make
root@sysdocu:~# make install


* 다른 설치 방법
root@sysdocu:~# cd /usr/local/src
root@sysdocu:~# git clone https://git.php.net/repository/pecl/networking/ssh2.git
root@sysdocu:~# cd ssh2
root@sysdocu:~# /usr/local/php/bin/phpize
root@sysdocu:~# ./configure --with-php-config=/usr/local/php/bin/php-config
root@sysdocu:~# make
root@sysdocu:~# make install


모두 정상적으로 명령이 실행되면 ssh2.so 파일이 /usr/local/php/lib/php/extensions/no-debug-zts-20170718/ 디렉토리에 생성됩니다.
php.ini 에 아래와 같이 입력해줍니다.

root@sysdocu:~# vi /usr/local/apache/conf/php.ini
extension_dir = "/usr/local/php/lib/php/extensions/no-debug-zts-20170718/"
extension = "ssh2.so"

혹시라도 extension_dir 이 다른 경로로 지정되어 있을경우 ssh2.so 파일을 그 디렉토리로 옮겨줍니다.


3. 확인
아파치를 재시작 후 모듈이 정상적으로 올라왔는지 확인합니다.
root@sysdocu:~# /usr/local/apache/bin/apachectl restart
root@sysdocu:~# /usr/local/php/bin/php -m |grep ssh2


4. 활용
이제 ssh2_connect 라는 함수 사용이 가능합니다.
php 파일을 만들고 웹상에서 확인해볼 수 있습니다.

test.php

<?

if(!function_exists("ssh2_connect")) die("서버 연결 실패");


if (!($con = ssh2_connect("system.neulwon.com", 22))) {

    echo "서버 접속 불가";

}


else {

    if (!($login = ssh2_auth_password($con, "root", "1q2w3e4r"))) {

        echo "서버 로그인 불가";

    }

    else {

        if (!($cmd = ssh2_exec($con, "ls -al"))) {

            echo "명령어 실행 불가";

        }

        else {

            echo "명령 실행 완료";

        }

    }

}

?> 


반응형

'리눅스 > PHP' 카테고리의 다른 글

php로 xinetd 데몬 만들기  (0) 2015.01.16
socket 접속 테스트 소스  (0) 2015.01.16
ChartDirector for PHP 오류  (0) 2015.01.16
PHP에서 SNMP 사용  (0) 2015.01.16
pdo_mysql 확장 모듈 설치  (0) 2015.01.16

댓글()