Im Allgemeinen speichern wir in der Datenbank nur Daten vom Typ int und varchar. Erstens, weil moderne relationale Datenbanken viele Optimierungen für diese Inhalte haben, und zweitens auch die meisten Indizes Es kann nicht auf Felder angewendet werden mit zu viel Inhalt sind beispielsweise Felder vom Typ Text nicht für die Erstellung von Indizes geeignet. Wenn wir eine Datenbank verwenden, speichern wir daher selten große Inhaltsfelder in der Datenbank. Allerdings stellt MySQL diese Art von Speicher tatsächlich für uns bereit, aber wir nutzen ihn normalerweise nicht oft.
„Groß“ bedeutet normalerweise „ungefähr 4 KB oder mehr“, obwohl einige Datenbanken problemlos bis zu 32 KB Daten verarbeiten können, bevor die Daten „groß“ werden. Große Objekte können Text- oder Binärobjekte sein, und wir können PDO dazu bringen, große Datentypen zu verwenden, indem wir den PDO::PARAM_LOB-Typcode im PDOStatement::bindParam()- oder PDOStatement::bindColumn()-Aufruf verwenden. PDO::PARAM_LOB weist PDO an, die Daten als Stream abzubilden, damit sie mithilfe der PHP-Streams-API manipuliert werden können.
In MySQL bedeutet die Einstellung des Feldtyps auf Blob, dass das Feld ein großes Objektformat hat. Wenn bei Verwendung von bindParam () oder bindColumn () der Parameter des angegebenen Felds vom Typ PDO::PARAM_LOB ist, können Sie den Inhalt dieses Objekts direkt in Form eines Handles abrufen und ihn wie fopen( weiter bearbeiten) ).
<code>CREATE TABLE `zy_blob` (<br> `id` int(11) NOT NULL AUTO_INCREMENT,<br> `attach` longblob,<br> PRIMARY KEY (`id`)<br>) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin;<br></code>
Dies ist eine Datentabelle für unsere Tests. Das Feld „Attach“ ist auf den Typ „Longblob“ eingestellt, was ein relativ großer Blobtyp ist, damit wir mehr Informationen speichern können. Schließlich können heutige Bilder oder Dateien problemlos einige MB oder Dutzende MB groß sein. Für einen einfachen Test verwenden wir direkt den größten Blob-Typ. Die Größe von Tinyblob beträgt 255 Byte, die Größe des Blob-Typs beträgt 65 KB, der Mediumblob beträgt 16 MB und der Longblob beträgt 4 GB.
Lassen Sie uns einfach das Big-Data-Objekt direkt bedienen, um zu sehen, was das Ergebnis ist.
<code>$stmt = $pdo->prepare("insert into zy_blob (attach) values (?)");<br>$fp = fopen('4960364865db53dcb33bcf.rar', 'rb');<br>$stmt->execute([$fp]);<br><br>$stmt = $pdo->query("select attach from zy_blob where id=1");<br>$file = $stmt->fetch(PDO::FETCH_ASSOC);<br>print_r($file); <br>// Array<br>// (<br>// [attach] => Resource id #6<br>// )<br></code>
Wir speichern die von fopen() geöffnete Datei direkt im Blob-Feld, ohne das Feld vorher zu binden. Aus der Datenbank lässt sich erkennen, dass die Blob-bezogenen Felder nur Zeichenfolgen in der Form „Ressourcen-ID #6“ speichern. Mit anderen Worten, ohne jegliche Verarbeitung wird das $fp-Handle zu einem String-Typ gezwungen, und das Ergebnis des erzwungenen Handle-Typs ist, dass nur eine Ressourcen-ID ausgegeben wird und der Blob nur mit dem Zeichentyp übereinstimmt Feld. Diese Zeichenfolge wird gerade aufgezeichnet.
Als nächstes werfen wir einen Blick auf die richtige Haltung, nämlich das Einfügen von Daten über bindParam() und das Lesen von Daten über bindColumn().
<code>$stmt = $pdo->prepare("insert into zy_blob (attach) values (?)");<br><br>$fp = fopen('4960364865db53dcb33bcf.rar', 'rb');<br><br>$stmt->bindParam(1, $fp, PDO::PARAM_LOB); // 绑定参数类型为 PDO::PARAM_LOB<br>$stmt->execute();<br><br>$stmt = $pdo->prepare("select attach from zy_blob where id=2");<br>// // $file = $stmt->fetch(PDO::FETCH_ASSOC);<br>// // print_r($file); // 空的<br>$stmt->execute();<br>$stmt->bindColumn(1, $file, PDO::PARAM_LOB); // 绑定一列到一个 PHP 变量<br>$stmt->fetch(PDO::FETCH_BOUND); // 指定获取方式,返回 TRUE 且将结果集中的列值分配给通过 PDOStatement::bindParam() 或 PDOStatement::bindColumn() 方法绑定的 PHP 变量<br>print_r($file); // 二进制乱码内容<br>$fp = fopen('a.rar', 'wb');<br>fwrite($fp, $file);</code>
Nachdem wir die Daten über bindParam() gebunden und den Typ PDO::PARAM_LOB angegeben haben, fügen wir zunächst den binären Inhalt des Dateihandles normal in die Datenbank ein. Als nächstes verwenden wir bindColumn() und geben außerdem den Typ PDO::PARAM_LOB an, um die abgefragten Daten abzurufen. Drucken Sie die abgefragten Feldinformationen direkt aus, und Sie können sehen, dass es sich um binäre Inhalte handelt. Abschließend speichern wir diesen Binärinhalt in einer Datei mit einem anderen Namen.
Das obige ist der detaillierte Inhalt vonWie PDO Big-Data-Objekte in MySQL verwaltet. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!