Simple enough.... Blob is a binary type, not a character type.   You need to 
put binary data in there, so in python 2x that's str, ie encode it.   Direct 
Unicode support in sqla is via the string/Unicode types.

Sent from my iPhone

On Nov 29, 2010, at 8:43 PM, Warwick Prince <warwi...@mushroomsys.com> wrote:

> Hi Michael
> 
> Thanks for your thoughts and comments to date.
> 
> I can replicate the problem with ease, so perhaps this will help;
> 
> # -*- coding: utf-8 -*-
> e = 
> create_engine('mysql+mysqlconnector://user:passw...@127.0.0.1/testdb?use_unicode=0',
>  encoding='utf8', echo=False)
> m = MetaData(e)
> t = Table('test_table', m, autoload=True)
> #test_table is;
> Table('test_table', 
> MetaData(Engine(mysql+mysqlconnector://user:passw...@127.0.0.1/testdb?use_unicode=0)),
>  Column(u'ID', INTEGER(display_width=11), table=<test_table>, 
> primary_key=True, nullable=False), Column(u'SourceType', VARCHAR(length=10), 
> table=<test_table>), Column(u'SourceID', VARCHAR(length=128), 
> table=<test_table>), Column(u'Date', DATE(), table=<test_table>), 
> Column(u'Time', TIME(timezone=False), table=<test_table>), Column(u'UserID', 
> VARCHAR(length=10), table=<test_table>), Column(u'Note', BLOB(length=None), 
> table=<test_table>), Column(u'Division', VARCHAR(length=3), 
> table=<test_table>), schema=None)
> 
> # Set some row  data in a dict
> columns = dict(ID=1, SourceType='TEST', SourceID='WAP', Note=u'Aligot\xe9')  
> # The Note column is set to a unicode value for a French word with accents. 
> Column type is BLOB
> 
> # insert it
> t.insert(values=columns).execute()
> 
> get this;
> Traceback (most recent call last):
>  File "<interactive input>", line 1, in <module>
>  File "C:\Python26\lib\site-packages\sqlalchemy\sql\expression.py", line 
> 1217, in execute
>    return e._execute_clauseelement(self, multiparams, params)
>  File "C:\Python26\lib\site-packages\sqlalchemy\engine\base.py", line 1722, 
> in _execute_clauseelement
>    return connection._execute_clauseelement(elem, multiparams, params)
>  File "C:\Python26\lib\site-packages\sqlalchemy\engine\base.py", line 1235, 
> in _execute_clauseelement
>    parameters=params
>  File "C:\Python26\lib\site-packages\sqlalchemy\engine\base.py", line 1343, 
> in __create_execution_context
>    connection=self, **kwargs)
>  File "C:\Python26\lib\site-packages\sqlalchemy\engine\default.py", line 384, 
> in __init__
>    self.parameters = self.__convert_compiled_params(self.compiled_parameters)
>  File "C:\Python26\lib\site-packages\sqlalchemy\engine\default.py", line 513, 
> in __convert_compiled_params
>    param[key] = processors[key](compiled_params[key])
>  File "C:\Python26\lib\site-packages\sqlalchemy\types.py", line 1209, in 
> process
>    return DBAPIBinary(value)
> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in position 
> 6: ordinal not in range(128)
> 
> It appears to be in the processing of the Binary type that something is going 
> wrong. 
> 
> Further testing showed something interesting.  I changed around the data 
> above and set the unicode value to the VARCHAR column SourceID.  That 
> worked..  Therefore, the issue is related to storing a unicode value into a 
> BLOB.  Surely I can store "anything" in a BLOB, or am I missing something?
> 
> Cheers
> Warwick
> 
> Warwick Prince 
> Managing Director 
> mobile: +61 411 026 992 
> skype: warwickprince  
> 
> phone: +61 7 3102 3730 
> fax:      +61 7 3319 6734 
> web:     www.mushroomsys.com 
> 
> On 30/11/2010, at 1:29 AM, Michael Bayer wrote:
> 
>> we've got unicode round trips down very well for years now with plenty of 
>> tests, so would need a specific series of steps to reproduce what you're 
>> doing here.  Note that the recommended connect string for MySQL + Mysqldb 
>> looks like mysql://scott:ti...@localhost/test?charset=utf8&use_unicode=0 .
>> 
>> On Nov 29, 2010, at 2:37 AM, Warwick Prince wrote:
>> 
>>> Hi All
>>> 
>>> I thought I had "Character Encoding" licked, but I've hit something I can't 
>>> work through.  Any help appreciated.
>>> 
>>> I have a "legacy" non SQL database that I read legacy data from (using cool 
>>> Python code that emulates the old ISDB binary comms) and it reads a str 
>>> which has "Foreign" language chars in it.  (French for example).  
>>> 
>>> So, firstly, I have   myStr = ''Aligot\xc3\xa9"  which when printed is 
>>> Aligoté.   So far so good.
>>> 
>>> I then convert that to unicode by  myUnicode = unicode(myStr, 'utf-8', 
>>> errors='ignore') and get u'Aligot\xe9'.   This printed is also Aligoté, 
>>> therefore all is good.
>>> 
>>> I have a MySQL database, InnoDB table, charset utf-8.
>>> 
>>> I set up my values in a dict called setValues with all the columns and 
>>> their respective unicode'd values ready to go
>>> 
>>> I then do a table.insert(values=setValues).execute() and get this error.
>>> 
>>> Traceback (most recent call last):
>>> File "C:\Documents and Settings\wprince\Desktop\PY CODE 
>>> DEVELOPMENT\CESyncSQL\TEST_Sync.py", line 148, in SYNC_IT
>>>  SyncFunction(ceDB, session, meta)
>>> File "C:\Documents and Settings\wprince\Desktop\PY CODE 
>>> DEVELOPMENT\CESyncSQL\TEST_Sync.py", line 840, in SYNC_VarietiesOUT
>>>  DAPDB_SetColumns(meta, 'varieties', 
>>> {'DescriptiveText':self.CEUnicode(tVarieties.ceVarietyText.value), 
>>> 'FlavourText':self.CEUnicode(tVarieties.ceFlavourText.value), 
>>> 'ImageURL':imageURL}, Variety=variety)
>>> File "C:\Python26\lib\DAPDBHelpers.py", line 323, in DAPDB_SetColumns
>>>  table.insert(values=setColumns).execute()
>>> File "C:\Python26\lib\site-packages\sqlalchemy\sql\expression.py", line 
>>> 1217, in execute
>>>  return e._execute_clauseelement(self, multiparams, params)
>>> File "C:\Python26\lib\site-packages\sqlalchemy\engine\base.py", line 1722, 
>>> in _execute_clauseelement
>>>  return connection._execute_clauseelement(elem, multiparams, params)
>>> UnicodeEncodeError: 'ascii' codec can't encode character u'\xe9' in 
>>> position 4: ordinal not in range(128)
>>> 
>>> I know what the error "means", I just don't know why I'm getting it.  The 
>>> offending u'\xe9' character is in the DescriptiveText column.  
>>> DAPDB_SetColumns is a simple wrapper around an update/insert that builds up 
>>> the table.insert(values=setColumns).execute() you see.
>>> 
>>> This is what setColumns looks like;
>>> {'ImageURL': '', 'DescriptiveText': u'Carm\xe9n\xe8re is a red wine grape 
>>> variety originally from Bordeaux, France. Having lost favor in France, the 
>>> largest area planted with this variety is in now Chile. It only survived, 
>>> due to growers believing it was Merlot. The vines were imported into Chil', 
>>> 'FlavourText': u'Carmenere is a full bodied red wine with approachable 
>>> tannins and a combination of sweet berry fruit, savory pepper, smoke, tar, 
>>> with a slight leafy character.\n', 'Variety': u'Carmenere'}
>>> 
>>> 'Variety' is the primary key BTW.
>>> 
>>> What gives?  It feels like SQLA is encoding/decoding somewhere it 
>>> shouldn't..
>>> 
>>> Cheers
>>> Warwick
>>> 
>>> -- 
>>> You received this message because you are subscribed to the Google Groups 
>>> "sqlalchemy" group.
>>> To post to this group, send email to sqlalch...@googlegroups.com.
>>> To unsubscribe from this group, send email to 
>>> sqlalchemy+unsubscr...@googlegroups.com.
>>> For more options, visit this group at 
>>> http://groups.google.com/group/sqlalchemy?hl=en.
>>> 
>> 
>> -- 
>> You received this message because you are subscribed to the Google Groups 
>> "sqlalchemy" group.
>> To post to this group, send email to sqlalch...@googlegroups.com.
>> To unsubscribe from this group, send email to 
>> sqlalchemy+unsubscr...@googlegroups.com.
>> For more options, visit this group at 
>> http://groups.google.com/group/sqlalchemy?hl=en.
>> 
> 
> -- 
> You received this message because you are subscribed to the Google Groups 
> "sqlalchemy" group.
> To post to this group, send email to sqlalch...@googlegroups.com.
> To unsubscribe from this group, send email to 
> sqlalchemy+unsubscr...@googlegroups.com.
> For more options, visit this group at 
> http://groups.google.com/group/sqlalchemy?hl=en.
> 

-- 
You received this message because you are subscribed to the Google Groups 
"sqlalchemy" group.
To post to this group, send email to sqlalch...@googlegroups.com.
To unsubscribe from this group, send email to 
sqlalchemy+unsubscr...@googlegroups.com.
For more options, visit this group at 
http://groups.google.com/group/sqlalchemy?hl=en.

Reply via email to