Inserting unicode escape sequence data to SQL server db (pyodbc) -
i'm trying insert data scraped web sql server db, , relevant columns of db table set nvarchar(max)
type.
testing in python shell:
dbargs={'database': '<mydbname>', 'driver': '{freetds}', 'port': '1433', 'pwd': '<mypass>', 'server': '<server>', 'uid': '<myusername>'} import pyodbc cnxn = pyodbc.connect(**dbargs) cursor = cnxn.cursor() insert_cmd="insert c_master (run_id, product_name) values (?,?)"
then
cursor.execute(insert_cmd, (274, u'test naméâôóòöë'))
works fine, however
cursor.execute(insert_cmd, (274, u'test \u2019d'))
causes error
programmingerror: ('42000', "[42000] [freetds][sql server]incorrect syntax near ','. (102) (sqlexecdirectw)")
i find scraping data of latter type , generating errors when try insert above db in writer pipeline.
what correct way handle such data?
(i'm using freetds, unixodbc, mssql server, pyodbc)
freetds , unixodbc conf:
/etc/odbc.init:
[myserver] driver = freetds description =myserver mssql database # servername corresponds section in freetds.conf servername=myserver database = mydbname tds_version = 7.0
/etc/odbcinst.ini:
[odbc] trace = yes tracefile = /tmp/odbcsql.log forcetrace = yes pooling = yes [freetds] description = tds driver (sybase/ms sql) driver = /usr/lib/x86_64-linux-gnu/odbc/libtdsodbc.so setup = /usr/lib/x86_64-linux-gnu/odbc/libtdss.so cptimeout = 120 cpreuse =
/etc/freetds/freetds.conf:
[global] tds version = 7.0 dump file = /var/log/freetds.log debug flags = 0xffff # timeout = 10 # connect timeout = 10 text size = 64512 [myserver] host = <myserverip> port = 1433 tds version = 7.0 dump_file = /var/log/freetds.log client charset = utf-8
i added tdsdump="/var/log/freetds.log" /etc/environment , /etc/profile. although weirdly, i'm still not seeing freetds log.
you need pass tds_version
part of connection string. you're connecting full connection string, bypasses dsn if pass full server name server in connect()
declaration. if want connect dsn, need provide dsn
(and uid
/ pwd
) rather server
, port
.
i've issued pull request better explain tds versions freetds here: https://github.com/freetds/freetds/pull/71
the default version of tds used if isn't provided doesn't support unicode (as saw!). assuming you're using sql server 2005 or newer, if you're using:
- freetds 1.0: use tds_version 7.4
- freetds 0.95: use tds_version 7.3
- freetds 0.91: use tds_version 7.2
good luck!
Comments
Post a Comment