MySQL의 이진 데이터 [닫기]


186

바이너리 데이터를 MySQL에 어떻게 저장 합니까?



2
@Nevir : 구체적으로 어떤 정보를 얻습니까? @phpguy@Mat 답변 에서 무엇을 느끼고 있지 않습니까?
eggyal

죄송합니다,이 현상금을 현상금으로 표시하지 않으려 고했지만 (SO와 함께 UI 버그가 발생했습니다) 현상금을 제거 할 수 없습니다
Nevir

현상금을 제거 할 수 있어야합니다
Akshay Giri FR

답변:


138

phpguy의 대답은 정확하지만 추가 세부 정보에는 많은 혼란이 있다고 생각합니다.

기본 답변은 BLOB데이터 유형 / 속성 도메인에 있습니다. BLOB 는 이진 큰 개체 (Binary Large Object)의 약자이며 해당 열 데이터 형식은 이진 데이터를 처리하기위한 것입니다.

MySQL 관련 매뉴얼 페이지를 참조하십시오 .


57

이와 같은 테이블의 경우 :

CREATE TABLE binary_data (
    id INT(4) NOT NULL AUTO_INCREMENT PRIMARY KEY,
    description CHAR(50),
    bin_data LONGBLOB,
    filename CHAR(50),
    filesize CHAR(50),
    filetype CHAR(50)
);

다음은 PHP 예제입니다.

<?php
    // store.php3 - by Florian Dittmer <dittmer@gmx.net>
    // Example php script to demonstrate the storing of binary files into
    // an sql database. More information can be found at http://www.phpbuilder.com/
?>

<html>
    <head><title>Store binary data into SQL Database</title></head>

    <body>
        <?php
            // Code that will be executed if the form has been submitted:

            if ($submit) {
                // Connect to the database (you may have to adjust
                // the hostname, username or password).

                mysql_connect("localhost", "root", "password");
                mysql_select_db("binary_data");

                $data = mysql_real_escape_string(fread(fopen($form_data, "r"), filesize($form_data)));

                $result = mysql_query("INSERT INTO binary_data (description, bin_data, filename, filesize, filetype) ".
                                    "VALUES ('$form_description', '$data', '$form_data_name', '$form_data_size', '$form_data_type')");

                $id= mysql_insert_id();
                print "<p>This file has the following Database ID: <b>$id</b>";

                mysql_close();
            } else {

                // else show the form to submit new data:
        ?>
        <form method="post" action="<?php echo $PHP_SELF; ?>" enctype="multipart/form-data">
            File Description:<br>
            <input type="text" name="form_description"  size="40">
            <input type="hidden" name="MAX_FILE_SIZE" value="1000000">
            <br>File to upload/store in database:<br>
            <input type="file" name="form_data"  size="40">
            <p><input type="submit" name="submit" value="submit">
        </form>

        <?php
            }
        ?>
    </body>
</html>

9
이 코드는 register_globals가 활성화 된 PHP3 (또는 4)과 같습니다. 이 코드를 실행하고 싶지 않으며 최신 PHP 설치 (버전 5)에서는 작동하지 않습니다.
까지

26
mysql_real_escape_string ()이 필요한 addslashes ()의 경우 -1 SQL 인젝션 취약점이있는 사람들에게 코드 제공을 중단 할 수 있습니까? (아니, addslashes ()는 충분하지 않습니다.)
혼돈

40

이진 데이터를 관계형 데이터베이스 저장하지 않는 것이 좋습니다 . 관계형 데이터베이스는 고정 크기 데이터로 작동하도록 설계되었습니다. 데이터베이스의 성능이 빠른 이유에 대한 Joel의 이전 기사 를 기억 하십니까? 레코드에서 다른 레코드로 이동하려면 정확히 1 포인터 씩 증가해야합니다. 정의되지 않고 매우 다양한 크기의 BLOB 데이터를 추가하면 성능이 저하됩니다.

대신 파일 시스템에 파일을 저장하고 데이터베이스에 파일 이름을 저장하십시오.


11
나는 공감하지는 않았지만, 대부분의 경우 나쁜 생각이라고 말하는 것과는 달리 절대로 그렇게해서는 안된다는 것을 암시했을 수 있습니다. 나는 그에게 일반적으로 동의하지만 100 %의 경우에는 그렇지 않습니다. 성능 이외의 고려 사항이있을 수 있습니다. 예를 들어 나는 성능이 전혀 중요하지 않은 무언가를 지금 만들고 있습니다. 중앙 집중화, 단순성 및 백업과 같은 다른 요소는이 경우 데이터베이스에 저장하는 것이 의미가 있음을 의미합니다. 또 다른 일반적인 이유는 복제입니다.
LaVache

4
반면 db에 데이터를 저장하는 것은 OS 독립적이므로 이상한 파일 이름에 좋습니다. db는 동일한 파일 이름으로 여러 파일을 저장할 수 있지만 OS는 할 수 없습니다. 읽기 / 쓰기 / 삭제 문제가 없습니다. 추가 백업 시스템이 필요하지 않습니다. 그리고 그것은 공개되지 않습니다. 때로는 개발 속도가 빠릅니다. Btw. 아무도 당신이 같은 데이터베이스에 모든 것을 저장하도록 강요하지 않습니다. 결국 모든 것이 디스크에있게됩니다.
Joeri

7
@AlexWeinstein, 바이너리 데이터와 고정 너비 데이터를 혼동하고 있습니다. 이진 데이터도 너비를 고정 할 수 있습니다. 고정 너비 데이터는 모든 상황에 적합하지 않습니다. 실제로, 많은 상황에서 당신은 가변 폭의 데이터 혜택을 누릴 것입니다 :의 읽기 마지막 단락 dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html
Pacerier

4
이것에 대한 @Pacerier와 동의하면 BINARY (16)는 고정되어 저장됩니다. BLOB의 경우 : BLOB에는 테이블 외부에 저장된 데이터에 대한 고정 너비 포인터가 있습니다. 그것은 인라인을 저장하는 varchar 또는 varbinary와는 다릅니다. 블롭을 검색하려면 몇 가지 추가 단계가 필요하지만 WHERE 절에서 제외하면됩니다.
Garr Godfrey

4
또한 파일 시스템에 파일을 저장하는 것이 매우 손상되어 이식 할 수 없다고 생각합니다. 파일이 삭제되면 어떻게됩니까?
Garr Godfrey


17

저장하려는 데이터에 따라 다릅니다. 위의 예는 LONGBLOB데이터 유형을 사용 하지만 다른 이진 데이터 형식이 있음을 알고 있어야합니다.

TINYBLOB/BLOB/MEDIUMBLOB/LONGBLOB
VARBINARY
BINARY

각각 사용 사례가 있습니다. 알려진 (짧은) 길이 (예 : 압축 된 데이터) 인 경우가 종종 BINARY있거나 VARBINARY작동합니다. 그들은 인덱스를 만들 수 있다는 이점이 있습니다.


14

필요하지는 않지만 base64데이터 인코딩 및 디코딩을 시도 할 수 있습니다. 즉, db에는 ASCII 문자 만 있습니다. 공간과 시간이 조금 더 소요되지만 이진 데이터와 관련된 문제는 제거됩니다.


11

- 권장하지 않음 -BLOB 필드가 존재하면 다음과 같이 데이터를 저장할 수 있습니다.

mysql_query("UPDATE table SET field=X'".bin2hex($bin_data)."' WHERE id=$id");

여기 에서 가져온 아이디어 .


10

BLOB으로 데이터를 가져 오는 방법도 문제입니다. PHP 예제에서 알 수 있듯이 INSERT 문에 데이터를 넣을 수 있습니다 (추가 슬래시 대신 mysql_real_escape_string 을 사용해야 함 ). 파일이 데이터베이스 서버에 존재하면 MySQL의 LOAD_FILE을 사용할 수도 있습니다


그 링크는 MySQL_real_escape_string이 더 이상 사용되지 않는다고 말합니다.
Poul Bak

당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.