十年网站开发经验 + 多家企业客户 + 靠谱的建站团队
量身定制 + 运营维护+专业推广+无忧售后,网站问题一站解决
“p偶四t g瑞e 噻噎k野u”
10年积累的网站制作、成都网站设计经验,可以快速应对客户对网站的新想法和需求。提供各种问题对应的解决方案。让选择我们的客户得到更好、更有力的网络服务。我虽然不认识你,你也不认识我。但先建设网站后付款的网站建设流程,更有泾县免费网站建设让你可以放心的选择与我们合作。
唉,,,,用文字表示声音,真难。
在PostgreSQL中并没有CREATE TABLE权限名称,这是与其它数据库不同的一个地方,PostgreSQL是通过控制是否在模式schema中上有CREATE控制用户的能否创建表的权限的,默认安装下,任何用户都有在模式public中CREATE的权限,所以要创建只读账号的第一步,我们要先去除在模式public中的CREATE权限:
REVOKE CREATE ON SCHEMA public from public;
下面的SQL创建了一个名为“readonly”的用户:
CREATE USER readonly with password 'query';
然后把现有的所有在public这个schema下的表的SELECT权限赋给用户readonly,执行下面的SQL命令:
GRANT SELECT ON ALL TABLES IN SCHEMA public TO readonly;
上面的SQL命令只把现有的表的权限给了用户readonly,但如果这之后创建的表,readonly用户还是不能读,需要使用下面的SQL把以后创建的表的SELECT权限也给用户readonly:
PostgreSQL中的bytea字段类型可以以二进制的形式存储数据,这样做的好处就是可以将原本存储在网站目录下的文件存储到数据库中,坏处就是如果文件过多、过大的话,就会导致数据库的数据量大大增加,备份和恢复的时候就会浪费大量的时间,而且数据也有可能会出错。个人觉得,在文件量小的情况下,使用这种存储方式还是很方便的。
言归正传,下面介绍一下使用bytea字段存读取文件的具体实现方法。首先是文件存储于存储于bytea字段的方法,主要用到的就是PHP中的pg_escape_bytea方法,代码如下:
?php
$dbconn = pg_connect("host='localhost' dbname='dbname' user='user' password='password' port='port'")
OR DIE('Could not connect:' . pg_last_error());
$fileUrl = iconv("utf-8", "gbk", $fileUrl);//$fileName为文件路径地址,汉字可能会乱码,此处处理一下
$fileContents = file_get_contents($fileUrl);
$escapeBytea = pg_escape_bytea($fileContents);//转义bytea数据类型的二进制字符串
$insertStr = "INSERT INTO tableName(id, contents)
VALUES(DEFAULT, '{$escapeBytea}')";
pg_query($dbconn, $insertStr);
?
从bytea字段中还原文件用到的是PHP中的pg_unescape_bytea方法,实现代码如下:
?php
$dbconn = pg_connect("host='localhost' dbname='dbname' user='user' password='password' port='port'")
OR DIE('Could not connect: ' . pg_last_error());
$selectStr = "SELECT contents
FROM tableName
WHERE id = " . $fileId;//$fileId为文件id
$query = pg_query($dbconn, $selectStr);
while($row = pg_fetch_array($query, null, PGSQL_ASSOC)){
$escapeBytea = $row['contents'];
$fileContents = pg_unescape_bytea($escapeBytea); //获得二进制数据
file_put_contents($fileName, $fileContents); //$fileName为带有后缀名的文件名,如hello.pdf
}
?
导出文件后,如果二进制数据转码错误就会出现文件打不开的现象,比如错误的PDF文件打开时弹出错误如下图:
这种错误在数据库迁移时特别容易出现(本人是从PostgreSQL 8.4迁移到9.1),解决的方法是修改PostgreSQL的配置文件
postgresql.conf,将bytea_output的输出类型设置为转义类型(escape)输出,即bytea_output = 'escape'(如果前面有#,删除开启配置),然后reload一下PostgreSQL的配置使修改生效,这样二进制数据就可以正常解码并输出到文件。
PostgreSQL
是一个自由的对象-关系数据库服务器(数据库管理系统),它在灵活的 BSD-风格许可证下发行。它提供了相对其他开放源代码数据库系统(比如
MySQL 和 Firebird),和专有系统(比如 Oracle、Sybase、IBM 的 DB2 和 Microsoft SQL
Server)之外的另一种选择。
PostgreSQL 不寻常的名字导致一些读者停下来尝试拼读它,特别是那些把SQL拼读为"sequel"的人。PostgreSQL 开发者把它拼读为 "post-gress-Q-L"。它也经常被简略念为 "postgres"。
PostgreSQL(数据库)资料
About:PostgreSQL About
《PostgreSQL 源码分析系列》
PostgreSQL 源码分析系列
介绍:PostgreSQL 源码分析系列文章
《PG 内存上下文》
介绍:PG 内存上下文,code
《PostgreSQL及其代码的结构》
介绍:PostgreSQL及其代码的结构
《A Tour of PostgreSQL Internals》
介绍:PostgreSQL内部的概览,可以结合上面的pg代码结构来阅读
《PostgreSQL 中的 Json —从使用到源码》
介绍:PostgreSQL 中的 Json —从使用到源码
《PostgreSQL锁机制分析》
我也得上线才能看到问题吧…………排前十用query就行了SELECT TOP 10 FROM 表 WHERE 筛选字段='要求' ORDER BY 排序字段OleDbConnection conn = new OleDbConnection(connectionString);OleDbCommand comm = new OleDbCommand(conn, query);conn.Open(); //这句经常忘,刚刚就忘了OleDbDataReader dr = comm.Excute();while(dr.read()){ Console.Writeline(dr("字段名").ToString()); //想怎么输出就怎么输出 }conn.Close();//这句也经常忘,刚刚也给忘了