shp2pgsql工具是将矢量的ShapeFile格式文件,制作成入库使用的Sql脚本。
首先我们需要分析一下,造成乱码的原因。以下是shp2pgsql的执行命令和生成的Sql脚本开头部分。
shp2pgsql.exe -s 4326 -c -D -I d:\1\测试数据.shp public.测试数据
SET CLIENT_ENCODING TO UTF8;
SET STANDARD_CONFORMING_STRINGS TO ON;
BEGIN;
CREATE TABLE "public"."测试数据" (gid serial,
"gb" varchar(16),
"dest" varchar(32),
"name" varchar(64),
"rn" varchar(32),
"sdtf" varchar(4),
"startp" varchar(32),
"type" varchar(32),
"bldtm" varchar(16),
"elevt" int2,
"rnp" varchar(254),
"ecp" varchar(254),
"areacode" int4,
"isauto" varchar(254),
"shape_leng" numeric,
"classid" varchar(250));
ALTER TABLE "public"."测试数据" ADD PRIMARY KEY (gid);
SELECT AddGeometryColumn('public','d59b323b','geom','4326','MULTILINESTRING',2);
我们发现生成的Sql中第一行即指定了本Sql文件的编码格式(即客户端的编码格式)为UTF8。所以此文件必须使用UTF-8编码。
此时问题就会出现了,若我们在Windows平台,通过命令行输入的任何字符都是GBK编码。这个GBK编码的中文名称就会传入shp2pgsql中,最后会作为Sql的一部分出现。最终就导致了这个Sql中,与表名相关的都是GBK编码的字符串,而其余插入矢量要素部分,都是UTF-8编码(由shp2pgsql负责读取shp中的要素信息,并最终输出为UTF-8编码),这就导致入库数据会乱码的根本原因。
确定好原因了,解决的办法就有很多了。本文采用替换方法。
将表名部分暂时使用特定的英文(如d59c323b),在shp2pgsql生成Sql后,将特定英文替换为UTF-8编码的字符串。
获取更多将矢量数据导入PostGIS的方法
浏览shp2pgsql官方用法
学习shp2pgsql源码
有更多PostGIS/PostgreSQL数据库问题,欢迎留言。转载需注明出处。