sql >> Database >  >> RDS >> Mysql

Bestanden opslaan als blob in database ajax php pdo

Volgens PHP/PDO/MySQL :invoegen in MEDIUMBLOB slaat slechte gegevens op , probeer de volgende regel te gebruiken om uw PDO-object te construeren:

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

Uitleg

Ik denk dat er, zoals Ben M opmerkt in de gekoppelde vraag, hier twee slechte ontwerpbeslissingen aan het werk zijn.

Er is dit concept van een verbindingstekenset. Het idee is dat de SQL-tekst in elke tekenset kan staan ​​en vervolgens wordt geconverteerd bij het ophalen door de SQL-server.

Dit werkt niet zo goed met binaire gegevens omdat het geen tekst is en dus per definitie niet in een tekenset mag staan, maar nog steeds wordt overgedragen met behulp van tekenreeksen .

Dit probleem kan worden opgelost door BLOB-gegevens te citeren tijdens de overdracht (ofwel met behulp van de BASE64_*-functies of door hex-escaping ) en dat is inderdaad wat veel mensen doen.

De tweede ontwerpbeslissing is in PDO/PHP:PDO doet geen charset-conversie (het kan niet, omdat strings in PHP inherent charset-agnostisch zijn), dus PHP is de enige (of een van de weinige talen) waar de keuze van de tekenset voor SQL-overdracht is eigenlijk belangrijk omdat deze moet overeenkomen met de codering waarin de invoerreeksen zich bevinden.

In andere talen moet de overdrachttekenset alleen expressief genoeg zijn om alle tekens te omvatten die in tekenreeksen kunnen worden gebruikt. In de huidige wereld van emoji's wordt dit hoogstwaarschijnlijk alleen gegarandeerd door unicode-tekensets (utf-8 en dergelijke). geen van deze is echter binair veilig (in die zin dat niet elke mogelijke combinatie van bytes een geldige string oplevert) dus zelfs als we het PHP-probleem zouden kunnen omzeilen, zouden we nog steeds met probleem #1 zitten.

In een ideale wereld zouden SQL-commando's altijd in de ASCII-tekenset staan ​​tijdens de overdracht en elke tekenreekswaarde zou een tekensetargument hebben, waarvan "binair" een mogelijke waarde zou kunnen zijn, die erbij wordt geleverd. MySQL heeft eigenlijk zo'n constructie voor strings, die het een "introducer" noemt. "_binary" lijkt echter geen geldige waarde te zijn.

Deze tekenset-informatie zou dan door het andere uiteinde worden gebruikt om de tekenreekswaarde om te zetten in de oorspronkelijke tekenset (ofwel de kolom voor client-naar-server-overdrachten of de tekenreeks-tekenset van de programmeertaal voor server-naar-client-overdrachten).

Op die manier zou het enige dat in BLOB-waarden zou moeten worden ontsnapt het tekenreeksscheidingsteken zijn (" of ' ).



  1. PHP:Dynamische drop-down met optgroup

  2. Grootste waarde van meerdere kolommen met kolomnaam?

  3. 6 veelvoorkomende storingsscenario's voor MySQL en MariaDB en hoe u ze kunt oplossen

  4. PostgreSQL 9-installatie op Windows:kan niet binnen het TEMP-omgevingspad schrijven.