UCS2 рдпрд╛ UCS4? - pyodbc рдФрд░ MSSQL рдореЗрдВ utf16 рдбреЗрдЯрд╛ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рддреЗ рд╣реИрдВ

рд╕рдорд╕реНрдпрд╛


UTF-16 рдПрдиреНрдХреЛрдбрд┐рдВрдЧ (UCS2) рдореЗрдВ MSSQL рд╕рд░реНрд╡рд░ 2005 рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдореИрдВ рдЕрдЬрдЧрд░ рдореЗрдВ рд▓рд┐рдЦреА рдЧрдИ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВред рдпрд╣ рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдбреЗрдЯрд╛рдмреЗрд╕ рдХреЗ рд╕рд╛рде рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдЙрдкрдХрд░рдгреЛрдВ рдХреЗ рдирд┐рдореНрдирд▓рд┐рдЦрд┐рдд рд╕реЗрдЯ рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреА рд╣реИ:

рдФрд░ рдпрд╣рд╛рдВ рдХрдард┐рдирд╛рдИ рджрд┐рдЦрд╛рдИ рджреА: рдЬрдм рдбреЗрдЯрд╛рдмреЗрд╕ (nvarchar, ntext рдлрд╝реАрд▓реНрдбреНрд╕) рд╕реЗ рд╕реНрдЯреНрд░рд┐рдВрдЧ рдбреЗрдЯрд╛ рдкреНрд░рд╛рдкреНрдд рд╣реЛрддрд╛ рд╣реИ, рддреЛ рдпреВрдирд┐рдХреЛрдб рдХреЛ рд╕рд╣реА рддрд░реАрдХреЗ рд╕реЗ рд╕рдВрд╕рд╛рдзрд┐рдд рдирд╣реАрдВ рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИред
рдЬреИрд╕рд╛ рдХрд┐ рдпрд╣ рдирд┐рдХрд▓рд╛, рдореИрдВрдиреЗ рдЬреЛ рдЕрдЬрдЧрд░ рд╕реНрдерд╛рдкрд┐рдд рдХрд┐рдпрд╛ рдерд╛ рд╡рд╣ UCS4 рдпреВрдирд┐рдХреЛрдб рдХреЗ рд╕рд╛рде рдмрдирд╛рдпрд╛ рдЧрдпрд╛ рдерд╛ред рдЕрдЬрдЧрд░ рд╡рд┐рдзрд╛рдирд╕рднрд╛ рдореЗрдВ рдпреВрдирд┐рдХреЛрдб рдкреНрд░рдХрд╛рд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рдиреЗ рдХреА рд╡рд┐рдзрд┐рдпрд╛рдВ рд╕реНрдЯреИрдХрдУрд╡рд░рдлреНрд▓реЛ рдкрд░ рдЗрд╕ рдкреНрд░рд╢реНрди рдореЗрдВ рдЕрдЪреНрдЫреА рддрд░рд╣ рд╕реЗ рд╡рд░реНрдгрд┐рдд рд╣реИрдВред рдпрджрд┐ рдЖрдк рдЯрд░реНрдорд┐рдирд▓ рдореЗрдВ рдирд┐рдореНрди рд▓рд╛рдЗрди рдирд┐рд╖реНрдкрд╛рджрд┐рдд рдХрд░рддреЗ рд╣реИрдВ:
python -c "import sys;print 'UCS4' if sys.maxunicode > 65536 else 'UCS2'" 
рддрдм рд╣рдореЗрдВ рдЕрдЬрдЧрд░ рдХреЗ рд▓рд┐рдП рдпреВрдирд┐рдХреЛрдб рдЕрд╕реЗрдВрдмрд▓реА рд╕рдВрд╕реНрдХрд░рдг рдорд┐рд▓рддрд╛ рд╣реИред рдореЗрд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдпрд╣ UCS4 рдерд╛ред рдпрд╣ рдЕрдкрдиреЗ рд▓рд┐рдП рдХреНрдпрд╛ рдЦреАрдВрдЪрддрд╛ рд╣реИ:
  1. unixODBC рдбрдмреНрд▓реНрдпреВ рдкрд░рд┐рд╢рд┐рд╖реНрдЯ (рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, SQLExecDirectW () ) рдХреЗ рд╕рд╛рде рд╕рдВрдмрдВрдзрд┐рдд рдбреЗрдЯрд╛рдмреЗрд╕ рдлрд╝рдВрдХреНрд╢рди рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИ, рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИред рдЬрд┐рд╕рдореЗрдВ рдкрд╛рда рдХрд╛ рдПрдХ рд╡рд░реНрдг 2 рдмрд╛рдЗрдЯреНрд╕ (UCS2) рд╡реНрдпрд╛рдкреНрдд рд╣реИ
  2. pyodbc ODBC рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдкреНрд░рд╛рдкреНрдд рдХрд░рддрд╛ рд╣реИ, рдФрд░ рдмрджрд▓реЗ рдореЗрдВ рдПрдХ рдпреВрдирд┐рдХреЛрдб рдЪрд░ рдХреЗ рдкрд░рд┐рдгрд╛рдореЛрдВ рдХреЛ рдмрдЪрд╛рддрд╛ рд╣реИ
  3. рдЗрд╕ рдкреНрд░рдХрд╛рд░, pyodbc рдХреЗ рдЕрдиреБрд╕рд╛рд░ рдкрд░рд┐рдгрд╛рдо рдХрд╛ 1 рд╡рд░реНрдг, 4 рдмрд╛рдЗрдЯреНрд╕ (UCS4) рд╣реИред рдЗрд╕ рддрд░рд╣ рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдмрдЪ рдЬрд╛рддрд╛ рд╣реИред ODBC рдбреНрд░рд╛рдЗрд╡рд░ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЧрдпрд╛ред

рдбреНрд░рд╛рдЗрд╡рд░ рдбреЗрдЯрд╛ рд╡рд╛рдкрд╕ рд▓реМрдЯрд╛рддрд╛ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдЪрд░рд┐рддреНрд░ 2 рдмрд╛рдЗрдЯреНрд╕ рд░рдЦрддрд╛ рд╣реИ, рдФрд░ pyodbc рдЗрд╕ рдбреЗрдЯрд╛ рдХреЛ рдлрд┐рд░ рд╕реЗ рдмрдирд╛рддрд╛ рд╣реИ рддрд╛рдХрд┐ рдЪрд░рд┐рддреНрд░ 4 рдмрд╛рдЗрдЯреНрд╕ рдкрд░ рдХрдмреНрдЬрд╛ рдХрд░ рд▓реЗред рдХреЛрдИ рднреА рд░реВрдкрд╛рдВрддрд░рдг рд╣реЛрдиреЗ рдкрд░ рд╕рдм рдХреБрдЫ рдареАрдХ рд╣реЛрдЧрд╛, рд▓реЗрдХрд┐рди рдбреЗрдЯрд╛ рдХреЛ рдмрд╕ рдмрд╛рдЗрдЯреНрд╕ рдХреЗ рдПрдХ рд╕рд░рдгреА рдХреЗ рд░реВрдк рдореЗрдВ рдпреВрдирд┐рдХреЛрдб рдкреНрд░рдХрд╛рд░ рдХреЗ рдПрдХ рдЪрд░ рдореЗрдВ рдмрдЪрд╛рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдЕрдкреНрд░рд┐рдп рдкрд░рд┐рдгрд╛рдо рд╣реЛрддреЗ рд╣реИрдВ: рдкрд░рд┐рдгрд╛рдо рд╡рд░реНрдг рдореЗрдВ рдЕрдирд┐рд╡рд╛рд░реНрдп рд░реВрдк рд╕реЗ ODBC рдбреНрд░рд╛рдЗрд╡рд░ рджреНрд╡рд╛рд░рд╛ рд▓реМрдЯрд╛рдП рдЧрдП рдкрд░рд┐рдгрд╛рдо рдХреЗ 2 рд╡рд░реНрдг рд╣реЛрддреЗ рд╣реИрдВред

рднрдпрд╛рдирдХ рдкрд░рд┐рдгрд╛рдо рдирд╣реАрдВ, рдореИрдВрдиреЗ рдлреИрд╕рд▓рд╛ рдХрд┐рдпрд╛ рдФрд░ рд╕реНрд╡рддрдВрддреНрд░ рд░реВрдк рд╕реЗ рдкрд░рд┐рдгрд╛рдо рдХреЛ рдмрджрд▓ рджрд┐рдпрд╛, рдЗрд╕реЗ рдкреНрд░рддреАрдХреЛрдВ рджреНрд╡рд╛рд░рд╛ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд┐рдпрд╛:
 def odbcUCS4toUCS2(ustr): u = u"" for i in range(0, len(ustr)): u32 = ord(ustr[i]) u16 = [(u32 & 0xFFFF0000) >> 16, (u32 & 0x0000FFFF)] u += unichr(u16[1]) u += unichr(u16[0]) return u 

рдпрд╣ рдкрд░реНрдпрд╛рдкреНрдд рдирд╣реАрдВ рдерд╛ред рдПрдХ рдФрд░ рдЕрдкреНрд░рд┐рдп рдкрд░рд┐рдгрд╛рдо рдерд╛: рдпрджрд┐ рдкрд░рд┐рдгрд╛рдо рдХреЗ рдкрд╛рддреНрд░реЛрдВ рдореЗрдВ рд▓рдВрдмрд╛рдИ рд╡рд┐рд╖рдо рд╣реИ, рддреЛ рдкрд░рд┐рдгрд╛рдо рдХрд╛ рдЕрдВрддрд┐рдо рдЪрд░рд┐рддреНрд░ рдЫреЛрдЯрд╛ рд╣реИ ред рдпрд╛рдиреА рд╕реНрдЯреНрд░рд┐рдВрдЧ 'рдпрд╣ рд╢рдмреНрдж' рдореЗрд░реА рд╕реНрдХреНрд░рд┐рдкреНрдЯ рдореЗрдВ 'рдЗрд╕ рд╢рдмреНрдж' рдХреЗ рд░реВрдк рдореЗрдВ рдкреНрд░рд╛рдкреНрдд рд╣реЛрдЧрд╛ред рдореИрдВ рдЕрднреА рднреА рдкрд░рд┐рд╡рд░реНрддрдиреЛрдВ рдХреЗ рд╕рд╛рде рдЗрд╕ рд╕рдорд╕реНрдпрд╛ рдХреЛ рд╣рд▓ рдирд╣реАрдВ рдХрд░ рд╕рдХрд╛: рдкрд░рд┐рдгрд╛рдо рдХреЗ рдЕрдВрддрд┐рдо рджреЛ рдмрд╛рдЗрдЯреНрд╕ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЧрд▓рдд рдпреВрдиреАрдХреЛрдб тАЛтАЛрднрдВрдбрд╛рд░рдг рдХреЗ рдХрд╛рд░рдг рдЕрдиреБрдкрд╕реНрдерд┐рдд рд╣реИрдВред рдлрд┐рд░ рдореИрдВ UCS2 рдпреВрдирд┐рдХреЛрдб рд╕рдорд░реНрдерди рдХреЗ рд╕рд╛рде рдЕрдЬрдЧрд░ рдХреЗ рдкреБрдирд░реНрдирд┐рд░реНрдорд╛рдг рдХреЗ рдирд┐рд░реНрдгрдп рдкрд░ рдЖрдпрд╛ред

рдирд┐рд░реНрдгрдп


рд╣рдо рдПрдХрддреНрд░ рдХрд░рддреЗ рд╣реИрдВ, рд╡рд┐рдХрд▓реНрдкреЛрдВ рдореЗрдВ рдирд┐рд░реНрджрд┐рд╖реНрдЯ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдордд рднреВрд▓рдирд╛ --enable-unicode = ucs2 ред рдПрдХ рдирдП рдЕрдЬрдЧрд░ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░рддреЗ рд╕рдордп, рдЖрдкрдХреЛ zlib1g-dev рдкреИрдХреЗрдЬ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдирд╛ рдпрд╛рдж рд░рдЦрдирд╛ рдЪрд╛рд╣рд┐рдП, рдЕрдиреНрдпрдерд╛ рдкрд╛рдЗрдк рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ рд╕рдВрдХреБрд▓ рдХреЛ рд╕реНрдерд╛рдкрд┐рдд рдХрд░рдиреЗ рдореЗрдВ рдХрдард┐рдирд╛рдИ рд╣реЛ рд╕рдХрддреА рд╣реИред
Virtualenv рд╕реНрдерд╛рдкрд┐рдд рдФрд░ рдХреЙрдиреНрдлрд╝рд┐рдЧрд░ рдХрд░реЗрдВ:
 $ sudo apt-get install virtualenv $ virtualenv ~/ucs2env -p [   ucs2 ] 

рдЦреИрд░, рдЙрдкрдирд╛рдо рдореЗрдВ рдЬреЛрдбрд╝реЗрдВ:
 echo "alias ucs2env='source ~/ucs2env/bin/activate'">>~/.bashrc 

рдЦреИрд░, рдпрд╣ рд╕рдм рд╣реИред рдЕрдм рдбреЗрдЯрд╛ рдЙрд╕реА рддрд░рд╣ рд╕реЗ рдкреНрд░рд╛рдкреНрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ рдЬреИрд╕реЗ рдбреЗрдЯрд╛рдмреЗрд╕ рдореЗрдВ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ:
 $ ucs2env (ucs2env)$ python -c "import sys;print 'UCS4' if sys.maxunicode > 65536 else 'UCS2'" UCS2 


Source: https://habr.com/ru/post/In148137/


All Articles