我有一系列字符串长度变化很多:从30到282420个字符。我想使用jdbc将每个字符串存储到postgres数据库中。
String query = "INSERT INTO " + tableName +
" (cbsID, ownerID, naam, soortRegio, jaar, centroidLat, centroidLon, borders) " +
" VALUES (?, ?, ?, ?, ?, ?, ?, ?)";
PreparedStatement ps = connection.prepareStatement(query);
for (Marker marker: gemeenteMarkers)
{
Area gemeente = (Area) marker.getProperty("area");
String sloc = "";
// ... do some computations
// Compute sloc, a string that may contain over 250.000 characters
ps.setInt (1, gemeente.getAreaId ());
ps.setInt (2, gemeente.getParentId ());
ps.setString (3, gemeente.getAreaName ());
ps.setString (4, "GM");
ps.setInt (5, 2014);
ps.setFloat (6, gemeente.getCentroid ().getLat ());
ps.setFloat (7, gemeente.getCentroid ().getLon ());
ps.setString (8, slocs);
System.out.printf ("%s - %d locations, len = %d\n", gemeente.getAreaName (), locs.size (), slocs.length ());
ps.addBatch ();
} // for
int [] affected = ps.executeBatch ();
除了slocs
之外,信息存储在数据库中,print
包含提到的字符串并存储在`boundary中。请参阅下面的pdAdmin截图。
Borders定义为TEXT。正如您在大多数情况下所看到的那样,它不会被存储,除非它很短,通常小于7000个字符。代码包含Appingedam - 1649 locations, len = 32980
Bedum - 1210 locations, len = 24200
Bellingwedde - 1500 locations, len = 30000
Ten Boer - 1186 locations, len = 23720
Delfzijl - 16 locations, len = 320
Groningen - 2662 locations, len = 53240
Grootegast - 4843 locations, len = 96860
Haren - 1940 locations, len = 38800
Hoogezand-Sappemeer - 1481 locations, len = 29620
Leek - 2575 locations, len = 51500
Loppersum - 2991 locations, len = 59820
Marum - 1936 locations, len = 38720
Almere - 213 locations, len = 4260
Stadskanaal - 2701 locations, len = 54020
Slochteren - 1555 locations, len = 31100
Veendam - 1098 locations, len = 21960
Vlagtwedde - 2621 locations, len = 52420
Zeewolde - 25 locations, len = 500
Winsum - 2992 locations, len = 59840
Zuidhorn - 5282 locations, len = 105640
Dongeradeel - 256 locations, len = 5120
Achtkarspelen - 4644 locations, len = 92880
Ameland - 158 locations, len = 3160
het Bildt - 2337 locations, len = 46740
Franekeradeel - 50 locations, len = 1000
Harlingen - 50 locations, len = 1000
Heerenveen - 5195 locations, len = 103900
语句,输出的一部分如下所示:
executeBatch
在postgres手册中我找到了
如果您希望存储没有特定上限的长字符串,请使用 文本或字符在没有长度说明符的情况下变化,而不是 构成任意长度限制。
似乎有一些长度限制,因为只有短文本显示在pgAdmin屏幕中。有谁知道我做错了什么?
修改1
很抱歉不清楚。我已经添加到代码示例中,我已经包含了程序的输出和pgAdmin来显示表中的数据。
修改2
我在示例中添加了>>> from py2neo import Graph
>>> myGraph = Graph(password='xxxx')
。它存在于原始代码中,输出不会改变。
答案 0 :(得分:10)
根据Postgres character type documentation,text
为variable unlimited length
再往下:
... PostgreSQL提供
text
类型,它存储任意长度的字符串。
<强>然而强>
根据Postgres Wiki,单个列值的硬限制为1GB,因此实际限制为&#34;无限制&#34;体系结构将text
长度限制为1GB。
答案 1 :(得分:0)
关于缺乏例子,有一些合理的评论。在玩这些例子时,我偶然发现了pgAdmin的一些显着行为:它没有显示存在的信息。只需在pgAdmin数据编辑器的输出中选择一些行,这些行显示在原始问题中并将其粘贴到编辑器中。然后 显示在pgAdmin的数据显示中看不到的信息,见下文。
3;0;"Appingedam";"GM";2014;53.3172;6.84957;"53.345131 6.885408 53.344925 6.885422 ...
5;0;"Bedum";"GM";2014;53.2949;6.59717;"53.255638 6.587573 53.255646 6.587514 53.25...
7;0;"Bellingwedde";"GM";2014;53.0986;7.12118;"53.097076 7.038233 53.097099 7.038254...
9;0;"Ten Boer";"GM";2014;53.2788;6.69145;"53.312183 6.740470 53.312176 6.740486 53...
10;0;"Delfzijl";"GM";2014;53.3227;7.09945;"53.322491 7.100943 53.322414 7.100940 5...
14;0;"Groningen";"GM";2014;53.2222;6.5634;"53.198223 6.515755 53.198238 6.515728 5...
15;0;"Grootegast";"GM";2014;53.2086;6.27322;"53.203838 6.318381 53.203819 6.318180 ...
17;0;"Haren";"GM";2014;53.1545;6.63106;"53.165165 6.560897 53.165207 6.560884 53.1...
18;0;"Hoogezand-Sappemeer";"GM";2014;53.1473;6.7468;"53.116516 6.743022 53.116371 6...
22;0;"Leek";"GM";2014;53.1633;6.36926;"53.211250 6.362241 53.211262 6.362327 53.21...
所以pgAdmin似乎表现得像你所看不到的是你没有得到的。 Java,jdbc和Postgres的行为与预期的一样,pgAdmin没有。