Mysql 설치부터 말썽이더니.. 이번에는 접속이 제대로 안됬다. Workbench를 이용하려는데 접속이 안되서 무엇인고 하니.. MySql 자체를 실행을 안해서 그랬다;;;; 



ㄴ 요 창 보기 싫으면 반드시 관리자 권한으로 가동한 후 net start mysql로 키고 net stop mysql로 끄거나 할 수 있다.



다 필요없고, Mysql Notifier라는 프로그램으로 원버튼 클릭에 껐다 켰다 할 수 있으니 그것도 좋다.





테스트용으로 db를 작성해보려는데.. localhost가 아닌 127.0.0.1를 입력하는 참사를 일으켰다. 그러지 말고 정상적으로 localhost를 입력했더니 정상적으로 된다.


schema를 작성하려고 하니.. 

name과

collation 이라는 것이 나온다.




collation은 사전을 보니 ① 대조 ② 간단한 식사 ③ 조사 라는 의미로 나온다.


찾아보았다.


출처 : http://blog.daum.net/warmfeel/106


  1. 문자셋(Character Set)
    • 말 그대로 특정 '문자(좀 더 정확히는 symbol)'가 컴퓨터에 저장될 때 어떠한 '코드'로 인코딩되어 저장될 것인지에 대한 규칙이 정의되어있는 집합을 말함. (character set is a set of symbols and encodings.
    • 대표적인 것으로는 ASCII, 한글을 지원하는 EUC-KR, 유니코드 UTF-8, UTF-16 등이 있음.
    • 문자셋은 자신이 처리할 문자 집합이 얼마나 큰가에 따라 하나의 '문자'를 저장하는데 필요한 저장공간의 크기가 달라지게 된다. 또한 항상 모든 문자들을 동일한 크기로 인코딩하는 고정폭 방식의 문자셋이 있는가하면, EUC-KR(1~2바이트)이나 UTF-8(1~3바이트)과 같이 가변폭 방식의 인코딩을 사용하는 문자셋도 있다.
  2. 콜레이션(Collation)
    • 이것은 특정 문자셋에 의해 데이터베이스에 저장된 값들을 검색하거나 정렬 등의 작업을 위해 문자들간에 서로 '비교'할때 사용하는 규칙들의 집합이다. (collation is a set of rules for comparing characters in a character set.) 따라서, 일반적인 Data Type에는 적용되지 않고, CHAR, VARCHAR, TEXT와 같은 데이터 타입을 가지는 칼럼들에 대해서만 적용된다.
    • 주로 대소문자를 구별하는 binary 형식을 사용할 것인지, 대소문자를 구별하지 않는 Case Insensitive 형식을 사용할 것인지로 나누어진다. Case Insensitive 형식을 사용하는 collation들은 모두 collation 이름의 끝에 'ci'라는 문자가 붙어있다.

 

'특정 문자 셋'에 의해 DB에 저장된 값들을 검색 , 정렬등을 위해 문자들을 '비교'할 때 사용되는 규칙의 집합...


특별히, MySQL에서의 문자셋과 collation 에 대한 문제는 단순히 데이터를 저장하는 공간에 대한 관점만이 아니라, MySQL 서버와 MySQL 서버에게 요청을 하는 클라이언트 사이에 주고받는 상호작용에 대한 관점까지도 포함한다는 것을 꼭 기억할 필요가 있다. 

  • 데이터를 저장하는 관점 : MySQL은 Server 레벨, Database 레벨, Table 레벨, Column 레벨까지 총 4개의 레벨을 지원하는 특징을 가지고 있음.

서로 지원하는 문자 규칙이 안맞는 경우 아예 변환 자체도 불가능한데 (가까운 예로 ANSI와 UTF-8) 클라이언트 (주로 웹)와의 상호 작용에 대한 관점 까지 포함하는 듯 하다.


서버와 클라이언트간의 상호작용 관점 : MySQL은 이 관점에서 문자셋과 관련한 총 3개의 서로 다른 타입을 제공한다.

  • character_set_client : 클라이언트에서 문장이 떠날 때 해당 문장은 어떤 문자셋으로 이루어져있는가의 문제
  • character_set_connection : 클라이언트에서 넘어온 문장을 서버에서는 어떤 문자셋을 기준으로 해석해야하는가의 문제.
  • character_set_results : 서버에서 클라이언트로 응답을 넘겨줄때 어떤 문자셋으로 넘겨야하는가의 문제.
    • 따라서, 데이터베이스 레벨에서 euckr 문자셋이 기본값으로 지정되어있는 데이터베이스를 생성한 후 해당 데이터베이스에 데이터를 잘 입력하였는데 이상하게 브라우저로 넘기면 데이터베이스에서 읽어온 문자만 글자가 깨지는 상황이 벌어진다면(브라우저의 인코딩 설정 등은 정상적이라고 가정) 다음과 같이 체크해봐야 한다.
      • Database 레벨, Table 레벨, Column 레벨에서 원하는 문자셋으로 잘 지정되어있는지를 확인
      • client, connection, results 에서의 문자셋도 적절하게 지정되어있는지를 확인. (대개 글자가 깨지는 경우라면, 아마도 이쪽이 잘못 지정되어있을 가능성이 높다)
    • SQL 문장 중에 'SET NAMES euckr [COLLATE collation_name]'을 사용하면 앞에서 살펴본 client, connection, results 3가지에 대한 문자셋을 한꺼번에 지정해줄 수 있음. (서버 실행중에도 변경이 가능. 단, 서버 실행중에 SQL 문장으로 변경하는 것은 영구 변경이 아니라 현재 연결에 한해서만 임시로 변경하는 것임)
    • 임시 변경이 아닌 영구 변경을 하려면, MySQL 서버가 처음 시작할 때 참고하는 my.cnf 환경설정 파일내에 'init_connect=SET NAMES euckr' 이런식으로 지정해두면 됨.
    • 이렇게 영구 변경과 임시 변경 방법을 활용하면 좀 더 다양한 응용이 가능해진다.
      • 서버가 시작하는 단계에서 지정하는 경우 : 대개 환경설정 파일인 my.cnf 파일에서 'init_connect=SET NAMES euckr' 명령어로 지정. 이렇게 했을때는 해당 서버를 사용하는 모든 애플리케이션들에게 이 설정이 기본값으로서의 영향을 미친다.
      • 시작 단계가 아니라 서버가 실행중에 데이터베이스 별로 다른 문자셋을 사용하도록 지정하는 경우 : 일단 클라이언트가 서버로 연결을 한 이후에 곧바로 'SET NAMES euckr' 명령어를 실행시켜서 현재 연결에 대한 연결 관련 문자셋들을 수정해놓고 시작한다. 이렇게 하면, 각각의 데이터베이스별로 서로 다른 연결 관련 문자셋을 지정할 수 있게 됨(!!!)
      • 즉, 동일한 서버내에서 대부분의 애플리케이션은 utf-8 문자셋을 사용하는데 특정 애플리케이션만 euckr 문자셋을 사용하고자 할 경우에 위와 같은 방법을 사용하면 가능.
      • 참고로, PHP에서 사용하는 mysqli 확장에서는 'SET NAMES ...'를 query 메소드로 실행시키는 방법 이외에 'set_charset' 이라는 더 나은 메소드를 통해서 동일한 효과를 얻을 수도 있음.
  1. (질문) PHPMyAdmin에서 새로운 데이터베이스를 생성할 때, 해당 데이터베이스에서 사용할 Default collation 만을 지정하게 되는데... 그렇다면, 해당 데이터베이스이 Default Character Set은 어떻게 되는 것일까?
    • (대답) 뭐... 당연한 이야기겠지만, Default collation 만을 지정하게 되면 해당 collation이 속해있는 Character Set이 자동으로 그 데이터베이스의 Default Character Set으로 지정됨. 물론, PHPMyAdmin의 GUI 방식을 사용하지 않고, 직접 DDL 문장을 사용하면 하나 하나 별도로 지정해줄 수도 있음. 또한, PHPMyAdmin에서 데이터베이스를 생성할 때, Default collation 조차도 지정하지 않게 되면, 당연히 MySQL의 환경설정 파일인 my.cnf(또는 my.ini)에서 지정되어있는 시스템의 기본적인 Character Set이 적용되게 되며 Collation은 해당 Character Set의 Default collation이 적용되게 됨.


결론적으로 내가 이 db의 데이터를 어떤 문자셋으로 관리할 것인지, 또 그것과 상호작용할 대상은 누구인지를 생각하고 써야하는 것 같다. 이번에 해보려고 한 것은 웹에서 구동되게 만들어보려 했으니, UTF-8을 선택하게 되었다.



예약하는 것을 만들어보려고 했는데, 해당 날짜에 존재하는 몇 곳 테이블(자리)에 대한 작성이었기 때문에 같은 날짜의 행이 있을 수 없고, 그것을 기반으로 테이블이 딸려오기 때문에 날짜(date)를 PK 값으로 잡고, 나머지는 예약이 있을 수도 없을 수도 있기에 NOT NULL을 설정하지 않을까 하였으나.. 무결성이 날아가는 것 같아 ""라도 쓰도록 NOT NULL을 강제했다.




상당히 단촐한 테이블 구성이 완료되었는데, 이곳에 쓰일 SP를 작성하면 DB에서의 작업은 거의 끝난 것 같다.








'프로그래밍 > MySQL' 카테고리의 다른 글

이벤트 스케줄러(Event Scheduler)  (1) 2016.06.21
MySql DB 작성해보기  (1) 2016.03.13
MySQL 저장 프로시져 내에서 발생한 에러 처리 (Error Handling)  (0) 2016.02.23
MySql 설치하기  (0) 2016.02.21
Auto Increment란  (0) 2016.02.05
MySql 주석을 달자  (0) 2016.02.01
Posted by GENESIS8

댓글을 달아 주세요

  1. 1466100957 2016.06.17 03:15  댓글주소  수정/삭제  댓글쓰기

    잘 읽고 가여~