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

Popular posts from this blog

mysql - Dreamhost PyCharm Django Python 3 Launching a Site -

java - Sending SMS with SMSLib and Web Services -

java - How to resolve The method toString() in the type Object is not applicable for the arguments (InputStream) -