[DB-SIG] mysql string length?

engelbert.gruber at ssg.co.at engelbert.gruber at ssg.co.at
Sun Apr 16 15:53:09 CEST 2006


On Sun, 16 Apr 2006, Andy Todd wrote:

> Lukasz Szybalski wrote:
>> On Sat, 2006-04-15 at 12:01 +0000, Andrew Chambers wrote:
>>> * Lukasz Szybalski <szybalski at gmail.com> [2006-04-14 12:00:09 -0500]:
>>>
>>>> INSERT INTO table_x( body)VALUES( '%s')" %  (body)
>>>>
>>>> this body is a string that varies in size. I keep getting an error if
>>>> the size of body is longer then 255, and if its smaller everything
>>>> goes smooth. Is this syntax correct? should '%s' be something else?
>>> What is the datatype of body?  It sounds like it is CHAR(255).  Can you
>>> change this to be TEXT?
>>>
>> Yes it is text.
>> mysql> describe table_x;
>> +----------+---------+------+-----+---------+-------+
>> | Field    | Type    | Null | Key | Default | Extra |
>> +----------+---------+------+-----+---------+-------+
>> | id | int(11) |      | PRI | 0       |       |
>> | body     | text    | YES  |     | NULL    |       |
>> +----------+---------+------+-----+---------+-------+
>>
>> Would some kind of characters that are passed in had something to do
>> with the error, maybe EOF or something similar?
>>
>> The string that is passed in is from xml node. For debugging i made it
>> return str(body), but that didn't change anything.
>>
>> Are there any other database/%s related requirements?

not the way you pass it (as i understand it python first does "%" 
replacement and then passes the string.

> My observation is that with MySQLdb %s is a parameter substitution value
> not a string substitution indicator.
>
> What happens when you try something like this;
>
> >>> stmt = "INSERT INTO table_x (body) VALUES (%s)" # [1]
> >>> cursor.execute(stmt, (body,))
>
> [1] note that there are no quote marks around the %s

this works here (debian testing, python 2.3.5, 4.0.21) 
::

import MySQLdb
"""
create table table_x (
   id int auto_increment primary key,
   body text
   )
"""
db = MySQLdb.connect(passwd="",db="test")
c = db.cursor()
body = "0....5...."*28
sql = "INSERT INTO table_x (body) VALUES('%s')"
c.execute( sql % (body))
c.execute("select body from table_x")
for row in c.fetchall():
     print len(row[0])

i wont bet on fetching 1Mb.

cheers
-- 


More information about the DB-SIG mailing list