[GRASS-user] after performing join all character fields are
trunctated to 1
Jon Eiriksson
jeir at hi.is
Fri Mar 30 12:34:18 EDT 2012
I recall a similar problem with MySQL, and that Micha Silver produced a join2 script that did not truncate (maybe it can be found in the mail archives?), - this improved script has, apparently, not made it into the most recent releases. SQLite manages with the current join, at least on my Mac.
Jon
On 30.3.2012, at 09:46, Micha Silver wrote:
> On 03/28/2012 10:38 PM, Jennifer Boehnert wrote:
>> Thank you Micha for the quick response. When I perform this join through the GUI on Windows I get the following error
>>
>> ERROR: value too long for type character (1)
>
> Hi Jennifer:
> Ahhh, I remember something about a bug in the v.db.join script.
>
> The script first gets a list of columns from the join table, then loops thru that list, creates a new column in the target table, and runs an UPDATE to get all the values from the join table into the target. The trouble comes with columns of type CHARACTER - the script does not check the length of the field, so by default (in Postgresql) it creates a field of length 1.
> Here's from the PostgreSQL manual:
>
> The notationsvarchar(n)andchar(n)are aliases forcharacter varying(n)andcharacter(n), respectively.characterwithout length specifier is equivalent tocharacter(1). Ifcharacter varyingis used without length specifier, the type accepts strings of any size. The latter is aPostgreSQLextension.
>
> Since the script uses the column definition "CHARACTER" and not "CHARACTER VARYING" the default length is 1.
>
> Here's a way to work around the problem. Let's Suppose you have a target vector called 'vect', and the join table called 'otable', your text column is 'long_text', and the id columns for the join are 'cat' and 'oid', then
>
> # first drop the wrong (length 1) text column
> v.db.dropcol vect col=long_text
> # Now recreate that column correctly
> v.db.addcol vect col="long_text varchar(255)"
> # And finally the update
> echo "UPDATE vect SET long_text=(SELECT long_text
> FROM otable
> WHERE otable.oid=vect.cat);" | db.execute database=<your db> driver=pg
>
> That's a one time fix. In order to get this working correctly permanently, changes are required to the v.db.join script. I'll suggest this to the devs.
>
> Regards,
> Micha
>>
>> and all my added fields which are of data type character have a length of 1 instead of the original 255. Any ideas what is going on? I am using postgreSQL 9.1 and GRASS 6.4.2 on Windows.
>> Thanks Jennifer
>>
>>
>> On 3/28/2012 12:56 PM, Micha Silver wrote:
>>> On 03/28/2012 08:49 PM, Jennifer Boehnert wrote:
>>>> Hello,
>>>> I have performed a join between a vector map and a postgreSQL table
>>>> using v.db.join. I would like to remove this join now. I cannot
>>>> figure out how to do this.
>>>
>>> I think you can just drop the additional columns with v.db.dropcol.
>>>
>>>> Thank you Jennifer
>>>>
>>>> _______________________________________________
>>>> grass-user mailing list
>>>> grass-user at lists.osgeo.org
>>>> http://lists.osgeo.org/mailman/listinfo/grass-user
>>>>
>>>> This mail was received via Mail-SeCure System.
>>>>
>>>>
>>>
>>>
>>> --
>>> Micha Silver
>>> GIS Consultant, Arava Development Co.
>>> http://www.surfaces.co.il
>>>
>>
>
>
> --
> Micha Silver
> GIS Consultant, Arava Development Co.
> http://www.surfaces.co.il
>
> _______________________________________________
> grass-user mailing list
> grass-user at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/grass-user
More information about the grass-user
mailing list