Mysql
 sql >> Teknologi Basis Data >  >> RDS >> Mysql

Menyimpan File sebagai gumpalan di database ajax php pdo

Sesuai PHP/PDO/MySQL :memasukkan ke MEDIUMBLOB menyimpan data yang buruk , coba gunakan baris berikut untuk membuat objek PDO Anda:

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

Penjelasan

Saya pikir ada, seperti yang dicatat Ben M dalam pertanyaan terkait, dua keputusan desain yang buruk bekerja di sini.

Ada konsep rangkaian karakter koneksi ini. Idenya adalah bahwa teks SQL dapat berada dalam rangkaian karakter apa pun dan kemudian dikonversi setelah diambil oleh server SQL.

Ini tidak bekerja dengan baik dengan data biner karena bukan teks dan, dengan demikian, menurut definisi, tidak boleh dalam rangkaian karakter apa pun, tetapi masih ditransfer menggunakan literal string .

Masalah ini dapat diatasi dengan mengutip data BLOB selama transfer (baik menggunakan fungsi BASE64_* atau dengan menghilangkan hex ) dan, memang, itulah yang dilakukan banyak orang.

Keputusan desain kedua ada di PDO/PHP:PDO tidak melakukan konversi charset apa pun (tidak bisa, karena string dalam PHP secara inheren charset-agnostic) jadi PHP adalah satu-satunya (atau salah satu dari sedikit bahasa) di mana pilihan charset transfer SQL sebenarnya penting karena harus cocok dengan pengkodean string input yang sebenarnya.

Dalam bahasa lain, rangkaian karakter transfer hanya perlu cukup ekspresif untuk mencakup karakter apa pun yang mungkin digunakan dalam string. Di dunia emoji saat ini, ini, kemungkinan besar hanya dijamin oleh rangkaian karakter unicode (utf-8 dan sejenisnya). Namun, tidak ada yang aman untuk biner (karena tidak setiap kemungkinan kombinasi byte menghasilkan string yang valid) jadi meskipun kami dapat mengatasi masalah PHP, kami masih akan menghadapi masalah #1.

Di dunia yang ideal, perintah SQL akan selalu berada di charset ASCII selama transfer dan setiap nilai string akan memiliki argumen charset, yang "biner" bisa menjadi nilai yang mungkin, disertakan dengannya. MySQL sebenarnya memiliki konstruksi string seperti itu, yang disebutnya sebagai "pengenal". “_binary”, bagaimanapun, tampaknya bukan nilai yang valid.

Informasi rangkaian karakter ini kemudian akan digunakan oleh ujung yang lain untuk mengubah nilai string menjadi rangkaian karakter aslinya (baik kolom untuk transfer klien-ke-server atau rangkaian karakter string bahasa pemrograman untuk transfer server-ke-klien).

Dengan begitu, satu-satunya hal yang harus diloloskan dalam nilai BLOB adalah pembatas string (" atau ' ).



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Arsitek untuk Keamanan:Panduan untuk MySQL

  2. Saya ingin menambahkan 30 hari ke baris tanggal mysql

  3. Gunakan Database Relasional MySQL di Ubuntu 8.04 (Hardy)

  4. Sisipkan beberapa baris dengan satu kueri MySQL

  5. Kesalahan String salah saat menambahkan emoji ke database melalui formulir