在数据库中存储更好的bytea或text type列的会话数据

时间:2014-01-28 13:28:41

标签: php postgresql pdo

我会将会话数据存储在数据库中,但我不确定哪种类型的列更好用(我将存储序列化对象和数组)。我认为更好的方法是使用BYTEA原因,当我几天前尝试使用命名空间的商店对象时,php的pdo丢失了一个头(从名称空间斜线)。为了解决问题,它将存储对象转换为BYTEA列,并在绑定值时告诉php使用类型PDO :: PARAM_LOB。

  $this->sth[$name]->bindValue($key, $value, PDO::PARAM_LOB);

但此参数仅适用于BYTEA列(Postgresql)。所以最好选择BYTEA列类型而不是TEXT ???有兴趣知道什么时候使用这个列类型??

我将很感激解决方案。

更新

我将使用session_set_save_handler函数和SessionHandlerInterface实现我的会话处理程序系统。它看起来像:

class SessionHandler{

   public function open($save_path, $session_name) {// some code}

   public function close() {//some code}

   public function read($id) {// some code}

   public function write($id, $data) {
   // Here i would implement mechanism to store object into database using php pdo. 
   // Here variable $data is already serialized by php session mechanism and ready to put into database. 
   // But i have unpleasantly experience storing serialized object 
   // using pdo client with namespaces thought bindParam function.

   // This experience is:
   // The serialized object (string) with namespace was cut at half, 
   // when i tried used PDO::PARAM_STR as argument in $sth->bindValue() (TEXT column i database). 
   // When to the same operation i used PDO::PARAM_LOB (BYTEA column in database) it was stored all fine.
   }

   public function destroy($id) {//some code}

   public function gc($maxlifetime) {// some code}

}

$hnadler = new SessionHandler()
session_set_save_handler($handler, true);

在此经历之后,我不确定使用哪种库存。

更新

谢谢你的切肉刀回答Craig Ringer:在你的帖子之后,我决定去查看php手册中关于序列化对象的确切内容:

http://www.php.net/manual/en/function.serialize.php

序列化功能

  Returns a string containing a byte-stream representation of value 
  that can be stored anywhere.

  Note that this is a binary string which may include null bytes, 
  and needs to be stored and handled as such. For example, serialize() 
  output should generally be stored in a BLOB field in a database, 
  rather than a CHAR or TEXT field.

所以你建议将对象存储在BYTEA类型列而不是TEXT中。

1 个答案:

答案 0 :(得分:2)

如果要存储序列化的应用程序数据,bytea是合适的选择。它只是字节,除了提供它的应用程序之外什么都没有意义,而且它不是 text ,因为它不是很好的字符。

因此,出于数据建模的原因,您应该使用bytea

此外,如果数据可能包含空字节,则必须使用bytea,因为text不能保存空字节,并且将数据编码为(例如)base64来解决这个问题只是效率低下可怕。