我会将会话数据存储在数据库中,但我不确定哪种类型的列更好用(我将存储序列化对象和数组)。我认为更好的方法是使用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中。
答案 0 :(得分:2)
如果要存储序列化的应用程序数据,bytea
是合适的选择。它只是字节,除了提供它的应用程序之外什么都没有意义,而且它不是 text ,因为它不是很好的字符。
因此,出于数据建模的原因,您应该使用bytea
。
此外,如果数据可能包含空字节,则必须使用bytea
,因为text
不能保存空字节,并且将数据编码为(例如)base64来解决这个问题只是效率低下可怕。