programing

MySQL 테이블에 이미지를 삽입하면 NULL이 됩니다.

newsource 2022. 9. 18. 12:49

MySQL 테이블에 이미지를 삽입하면 NULL이 됩니다.

이 코드에 무슨 문제가 있나요?테이블에 이미지를 삽입하고 싶은데 이 코드를 실행했을 때 이미지 필드의 결과는 다음과 같습니다.NULL.

MySQL Workbench를 사용하여 다음을 실행합니다.

CREATE TABLE image(keyh int, img blob);
INSERT INTO image VALUES(1, load_file('d:\Picture\cppLogo.png'));

이 기능을 사용하려면 파일이 서버 호스트에 있어야 하며 파일의 전체 경로 이름을 지정해야 하며 FILE 권한이 있어야 합니다.이 파일은 모두가 읽을 수 있어야 하며 크기가 max_allowed_packet 바이트 미만이어야 합니다.secure_file_priv 시스템 변수가 비어 있지 않은 디렉토리 이름으로 설정되어 있는 경우 로드할 파일이 해당 디렉토리에 있어야 합니다.

파일이 존재하지 않거나 위의 조건 중 하나가 충족되지 않아 읽을 수 없는 경우 함수는 NULL을 반환합니다.

http://dev.mysql.com/doc/refman/5.7/en/string-functions.html#function_load-file

당신은 무엇을 할 수 있나요?

실행 중인 사용자 mysql을 확인하고 해당 사용자가 파일을 읽을 수 있는지 확인합니다.보안 설정에서 파일 읽기가 허용되고 파일 크기가 다음 크기보다 크지 않은지 확인하십시오.max_allowed_packet.

SHOW VARIABLES LIKE 'max_allowed_packet'.

저는 파일이 로컬호스트에 있는 것처럼 보이고 업로드하려고 합니다.이것은 다음 방법으로는 가능하지 않습니다.LOAD_FILE()파일이 서버에 이미 존재해야 합니다.

이 문제는 Windows 디렉토리의 구분 문자에서도 발생할 수 있습니다.\(Riggs Folly가 말한 것처럼) 대신 탈출에 사용되는 unix 스타일로 전환합니다./그 후, 다음과 같이 합니다.

LOAD_FILE('D:/Picture/cppLogo.png')

또는 이미지 파일 크기가BLOB발라즈 바고의 말처럼 들판은 버틸 수 있다.

올바른 구문은 다음과 같습니다.

C:/wamp/binsql5.5.20/data/56VRLRFE.jpg'

이것 말고

C:\wamp\binsql5.5.20\data\56VRLRFE.jpg'

여러분의 모든 답변에 감사드립니다:D

MySql 명령줄 클라이언트를 열고 루트 사용자 및 유형으로 로그인합니다.

mysql> SHOW VARIABLES LIKE "secure_file_priv";

이것은 MySql이 파일에 접근하기 위해 사용하는 안전한 경로를 보여줍니다.

+------------------+-----------------------+
| Variable_name    | Value                 |
+------------------+-----------------------+
| secure_file_priv | /var/lib/mysql-files/ |
+------------------+-----------------------+

이 폴더 내에 파일을 붙여넣거나 "secure_file_priv" 변수 값을 "empty string"으로 변경하여 어디서든 파일을 읽을 수 있습니다.

Windows의 근본적인 문제는 MySql이 기본적으로 네트워크 계정에서 Windows 서비스로 실행된다는 것입니다. 즉, 서버가 액세스할 수 있는 파일 위치는 몇 개뿐입니다.따라서 load_file이 작동하려면 서버에서 읽을 수 있는 폴더에 파일을 저장해야 합니다.이에 대한 문서는 없는 것 같습니다.조사 결과 load_file에서 동작하는 폴더는 C:\ProgramData\My뿐입니다.SQL\MySQL Server 8.0\업로드

로드를 테스트하기 위해 쿼리 실행...

select load_file('C:\\ProgramData\\MySQL\\MySQL Server 8.0\\Uploads\\1.txt') ;

창에서는 경로 요소를 구분하려면 이중 \ 또는 / 중 하나를 사용해야 합니다.이렇게 하면 실패 시 NULL이 반환됩니다.그렇지 않으면 파일의 내용이 반환됩니다.

이제 db.image라는 이름의 테이블과 열 소스 및 이미지가 있다고 가정합니다.소스는 문자이고 이미지는 BLOB입니다.a.jpg를 테이블에 로드하는 명령어는 다음과 같습니다.

insert into db.image (source,image) values ('a.jpg',load_file('c:/programdata/mysql/mysql server 8.0/uploads/a.jpg'));

예를 들어 폴더 이름 없이 직접 저장 -

create table myimg(id int, image mediumblob);

insert into myimg values(101, load_file("E://xyz.png"));

언급URL : https://stackoverflow.com/questions/41723126/when-i-insert-a-image-into-mysql-table-the-result-is-null