Mysql
 sql >> Cơ Sở Dữ Liệu >  >> RDS >> Mysql

Lưu tệp dưới dạng blob trong cơ sở dữ liệu ajax php pdo

Theo PHP / PDO / MySQL :chèn vào MEDIUMBLOB lưu trữ dữ liệu xấu , hãy thử sử dụng dòng sau để tạo đối tượng PDO của bạn:

$dbh = new PDO($dsn, $username, $password, array(PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES latin1 COLLATE latin1_general_ci"));

Giải thích

Tôi nghĩ rằng, như Ben M đã lưu ý trong câu hỏi được liên kết, có hai quyết định thiết kế tồi tại nơi làm việc.

Có khái niệm này về một tập ký tự kết nối. Ý tưởng là văn bản SQL có thể nằm trong bất kỳ bộ ký tự nào và sau đó được chuyển đổi khi máy chủ SQL truy xuất.

Điều này không hoạt động tốt với dữ liệu nhị phân vì nó không phải là văn bản và do đó, theo định nghĩa, không được ở trong bất kỳ bộ ký tự nào, nhưng vẫn được chuyển bằng cách sử dụng chuỗi ký tự .

Sự cố này có thể được khắc phục bằng cách trích dẫn dữ liệu BLOB trong quá trình truyền (sử dụng các hàm BASE64_ * hoặc bằng hex-escaping ) và, thực sự, đó là điều mà nhiều người đang làm.

Quyết định thiết kế thứ hai là trong PDO / PHP:PDO không thực hiện bất kỳ chuyển đổi bộ ký tự nào (không thể, bởi vì các chuỗi trong PHP vốn là bộ ký tự bất khả tri) vì vậy PHP là ngôn ngữ duy nhất (hoặc một trong số ít ngôn ngữ) có sự lựa chọn bộ ký tự chuyển SQL thực sự quan trọng vì nó cần khớp với mã hóa mà các chuỗi đầu vào thực sự có trong đó.

Trong các ngôn ngữ khác, bộ ký tự chuyển chỉ cần đủ biểu cảm để bao gồm bất kỳ ký tự nào có thể được sử dụng trong chuỗi. Trong thế giới biểu tượng cảm xúc ngày nay, điều này rất có thể chỉ được đảm bảo bởi các bộ mã unicode (utf-8 và những thứ tương tự). Tuy nhiên, không ai trong số này là an toàn nhị phân (trong đó không phải mọi sự kết hợp có thể có của các byte đều tạo ra một chuỗi hợp lệ) vì vậy ngay cả khi chúng tôi có thể giải quyết vấn đề PHP, chúng tôi vẫn sẽ gặp vấn đề số 1.

Trong một thế giới lý tưởng, các lệnh SQL sẽ luôn ở trong bộ mã ASCII trong quá trình truyền và mọi giá trị chuỗi sẽ có một đối số bộ mã, trong đó “nhị phân” có thể là một giá trị khả thi, được cung cấp cùng với nó. MySQL thực sự có một cấu trúc như vậy cho các chuỗi, mà nó gọi là “trình giới thiệu”. Tuy nhiên, “_binary” dường như không phải là một giá trị hợp lệ.

Thông tin về bộ ký tự này sau đó sẽ được đầu bên kia sử dụng để chuyển đổi giá trị chuỗi thành bộ ký tự gốc của nó (hoặc là của cột để chuyển từ máy khách đến máy chủ hoặc bộ ký tự chuỗi của ngôn ngữ lập trình để chuyển từ máy chủ đến máy khách).

Theo cách đó, thứ duy nhất sẽ phải được thoát trong các giá trị BLOB sẽ là dấu phân cách chuỗi (" hoặc ' ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. cách chọn số lượng từ truy vấn chính thành truy vấn phụ

  2. Làm cách nào để lưu trữ mảng trong MySQL?

  3. Rails:Buộc chuỗi rỗng thành NULL trong cơ sở dữ liệu

  4. Xóa hồ sơ trước một ngày nhất định

  5. RuntimeError:hoạt động bên ngoài ngữ cảnh ứng dụng