Category Archives: DB

[Mysql] varchar(256) vs varchar(255)

DB컬럼의 변경을 위해서 무의식적으로 varchar(256)을 신청을 했는데, DB관리자로 부터 다음과 같은 이야기를 들었다.

“정말로 긴 글자를 저장하셔야 하는 상황이라면 varchar(256) 대신 varchar(255) 로 처리가 가능하신지도 문의드립니다.
255 와 256은 mysql 내부적으로 차이가 큽니다.”

음 그래요? 무슨 차이 일까?

 

DBMS는 내부에서 varchar타입을 저장할때, 그 데이터의 길이도 저장하는데, 255 까지는 이 길이를 저장하는데 single byte가 필요하다.

그러나 256 혹은 그 이상이 되는 순간, two byte 가 필요하게 되면서 더 많은 디스크 점유를 발생시킨다.

덧붙여, 오라클을 제외한 대부분의 DBMS는 NULL 과 빈 string 을 의도적으로 구별하는데, 이 역시 varchar컬럼이 더 많은 공간을 차지하게 되는 원인이 된다.

 

출처 (stackoverflow.com/a/2340662)

[MariaDB] Ubuntu에 MariaDB 설치하기

Ubuntu에 마리아DB를 설치해보자.

온갖 삽질 끝에 온전한 정답을 찾을 수 있었다.

더더군나나 사내망에서 설치하느라 눈물을 쏟았다.

엉엉

  1.  기본설치
    여기 로 가면 기본적으로 설치하는 방법이 나와있다.
    운영체제와 자신이 설치하려는 버전을 맞게 설정해줘야한다.

    sudo apt-get install software-properties-common
    sudo apt-key adv --recv-keys --keyserver hkp://keyserver.ubuntu.com:80 0xcbcb082a1bb943db
    sudo add-apt-repository 'deb [arch=amd64,i386,ppc64el] http://ftp.kaist.ac.kr/mariadb/repo/10.1/ubuntu trusty main'
    sudo apt-get update
    sudo apt-get install mariadb-server

    여기서 첫번쨰 위기가 찾아온다. apt-key에 proxy설정을 안해주면 키를 import를 못한다. adv 뒤에

    --keyserver-options http-proxy=<myProxy>

    를 붙여주자.
    그리고 설치하기전에

    sudo cat /etc/apt/sources.list
    

    명령어를 날려서 mariadb가 올바른 repo와 버전을 바라보고 있는지 확인하자.

    그외에는 저대로 그냥 따라서 명령어만 쳐주면 잘된다.

  2. 설정
    설정을 해줘야 한다. 그렇지 않으면 접근이 안된다. 그리고 한글이 안써진다.
    별다른 짓을 안했다면 설정파일의 위치는 /etc/mysql/my.conf 다.

    [client]
    default-character-set=utf8
    [mysqld]
    bind-address=0.0.0.0
    init_connect="SET collation_connection=utf8_general_ci"
    init_connect="SET NAMES utf8"
    character_set_server=utf8
    collation-server=utf8_general_ci
    [mysql]
    default-character-set=utf8
    [mysqldump]
    default-character-set=utf8

     

  3. 실행
    mysql -u root -p
    

    접속후

    show variables like 'c%';

    를 날려서 utf8로 아름답게 설정이 되어 있는지 확인해보자.

    +--------------------------+----------------------------+
    | 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/share/mysql/charsets/ |
    | collation_connection     | utf8_general_ci            |
    | collation_database       | utf8_general_ci            |
    | collation_server         | utf8_general_ci            |
    | completion_type          | NO_CHAIN                   |
    | concurrent_insert        | ALWAYS                     |
    | connect_timeout          | 5                          |
    +--------------------------+----------------------------+
    
  4. 사용자 설정
    여기까지만 하면 접속이 될줄 알았는데 아니다. 사용자 별로 접근가능한 데이터베이스와 ip 주소를 설정해줘야 한다.

    GRANT ALL PRIVILEGES ON database.table TO 'user'@'host' [IDENTIFIED BY 'password']

    이런식으로 (테이블까지는 정의하지 않아도 된다.) 사용자 별로 외부에서 접속 할 수 있는 권한을 주면 된다.

힘들어따

 

[MongoDB] GridFS by Java

파일 저장

//MongoDB Connect to Host
 Mongo mongo = new Mongo("localhost:27017");
 //Set db
 DB db = mongo.getDB("gridfs");
 //Set Filename in MongoDB
 String newFileName = "target.mp4";
 //File Path
 File mvFile = new File("c:\\mongodb\\source\\target.mp4");
 //Set Target GridFS
 GridFS gfsMV = new GridFS(db, "mv");
 //Create gfsFile, name, ContentType
 GridFSInputFile gfsFile = gfsMV.createFile(mvFile);
 gfsFile.setFilename(newFileName);
 gfsFile.setContentType("video/mpeg");
 //Set Chunck Size 
 gfsFile.setChunkSize(256*1024);
 gfsFile.save();
 System.out.println("_id: " + gfsFile.getId());
 mongo.close();

저장된 파일 리스트

 

 Mongo mongo = new Mongo("localhost:27017");
 DB db = mongo.getDB("gridfs");

 GridFS gfsMV = new GridFS(db, "mv");
 
 //Get all File list
 DBCursor cursor = gfsMV.getFileList();
 
 //Select Specific file
// DBObject query = new BasicDBObject("filename", "target.mp4");
 //Select Specific file with RegEx
// DBObject query = new BasicDBObject("fileName", Pattern.compile("^t.*\\.mp4$", Pattern.CASE_INSENSITIVE));
// DBCursor cursor = gfsMV.getFileList(query);

 while (cursor.hasNext()) {
 System.out.println(cursor.next());
 }
 mongo.close();

 

파일불러오기

 

 Mongo mongo = new Mongo("localhost:27017");
 //Connect to DB
 DB db = mongo.getDB("gridfs");
 String filename = "target.mp4";
 GridFS gfsMV = new GridFS(db, "mv");
 // by file name
 GridFSDBFile videoForOutput = gfsMV.findOne(filename);
 // by object id
 //GridFSDBFile videoForOutput = gfsMV.findOne(new ObjectId("......"));
 
 InputStream s = videoForOutput.getInputStream();
 FileOutputStream fos = new FileOutputStream("c:\\_mongo\\a.mp4");
 int len = 0;
 // chunk size
 byte[] buf = new byte[256 * 1024];
 len = s.read(buf, 0, buf.length);
 while (len > 0) {
 fos.write(buf, 0, len);
 len = s.read(buf, 0, buf.length);
 }
 s.close();
 fos.close();

[MongoDB] objectid(_id) 로 입력된 시간 가져오기

Object ID는 총 12바이트로 다음과 같은 구조를 가지고 있다.

4바이트 : TimeStamp (영국표준시 1970.1.1부터 현재까지 흐른 초)
3바이트 : Machine의 Hash 값중에 앞 3바이트를 자른 나머지
2바이트 : PID
3바이트 : Increment

그렇기 때문에, objectid의 앞 4바이트로 시간을 추측해 볼 수 있을 것이다.

db.persons.find().forEach(function(d) { 
    var ts = d._id.toString().substring(10,18);
    dt = new Date( parseInt( ts, 16 ) * 1000 );
    print(dt);
})