PostgreSQL数据库表名大小写,空间数据导入后乱码两个问题
目录
今天使用shp2pgsql导入了一个表到自己的空间数据库中,但是遇到几个问题,在这里贴出自己的解决方法。
导入数据的乱码问题
如图,新建一个空的空间数据库,此时编码显示正常,服务器和客户端都是正常的UTF编码,但是导入shpfile的数据后出现了显示的乱码:
原因分析:
假设服务端编码为UTF-8,客户端工具psgl默认为GBK,
-
在此环境下插入“汉字”,一切正常。此时传到客户的“汉字”为GBK编码,自动转为UTF-8编码存到服务端;而查询时,又自动将服务端的UTF-8编码转为GBK来显示,所以没有出现乱码。
-
将客户端编码设置为UTF-8,则刚才插入的“汉字”不能正常显示。因为此时客户端和服务端的编码一样,在取数据时不进行任何转换,直接将存在服务端的UTF8编码的字节传到客户端,之后psgl直接显示,所以就乱码了。
-
此环境下插入“汉字”,则添加不成功,因为“汉字”直接以GBK的形式传到服务端,UTF8编码不认识,所以就报错。(现在客户端编码为UTF8,所以提示的中文信息也乱码了)。
解决方法:
客户端默认编码为 utf-8, 改为 gbk (\encoding 查看当前客户端编码字符集):
* set client_encoding to 'gbk'
导入的数据表的表名大小写问题
第二个问题是查询表的时候,直接输入表名提示无法表关系不存在。
原因分析:
PostgreSQL 是大小写敏感的,并默认对SQL语句中的数据库对象名称转换为小写,因此如果你在创建数据库对象时指定了大小写混和的对象名称,那么在通过SQL语句访问 这些对象时,由于Postgresql数据库里表名应该是分大小写的,导致找不到City_P这个表。
解决方法:
使用双引号“”将数据库对象括起来,以提示 PostgreSQL 不用帮你转换对象名为小写,否则将激发“xxxxx对象不存在”的异常,譬如刚才名为 City_P 的表,在 PostgreSQL 命令行下中必须使用类似这样的查询语句才能正确执行:SELECT * FROM “City_P”,当然它对 SQL 标准中的保留字和关键字是不区分大小写的,所以写成 select * From “City_P” 这样也是完全可以的。