MS jdbc SQL2k cyrillic ?????? F1
3 отговора
130 прегледа
MS jdbc SQL2k cyrillic ?????? F1
Здравейте,
вече много го закъсах.
Имам един site, писан на JAVA. Insert-ва в MSSQL2000. Проблема е, че когато пълня базата през Site-a, кирилицата ми се insert-ва с '????? ?? ???', ако го направя например през QuerryAnilizer e OK. Мисля, че проблема е в MS JDBC driver-a, но не знам как да го FIX-на.
Ето и малко повече инфо:
Connection url = jdbc:microsoft:sqlserver://localhost:1433;user=test;password=test;SendStringParametersAsUnicode=false;SelectMethod=cursor
MSSQL2К DB Collation Cyrillic_General_CI_AS
BTW не разбирам много от JAVA, да не кажа хич :)
Предварително благодаря и много ще се радвам, ако някой даде едно рамо.
Яна
"Не карай по-бързо отколкото твоя ангел пазител може да лети!"
вече много го закъсах.
Имам един site, писан на JAVA. Insert-ва в MSSQL2000. Проблема е, че когато пълня базата през Site-a, кирилицата ми се insert-ва с '????? ?? ???', ако го направя например през QuerryAnilizer e OK. Мисля, че проблема е в MS JDBC driver-a, но не знам как да го FIX-на.
Ето и малко повече инфо:
Connection url = jdbc:microsoft:sqlserver://localhost:1433;user=test;password=test;SendStringParametersAsUnicode=false;SelectMethod=cursor
MSSQL2К DB Collation Cyrillic_General_CI_AS
BTW не разбирам много от JAVA, да не кажа хич :)
Предварително благодаря и много ще се радвам, ако някой даде едно рамо.
Яна
"Не карай по-бързо отколкото твоя ангел пазител може да лети!"
Re: MS jdbc SQL2k cyrillic ?????? F1
Нямам никакъв опит с JDBC драйвери за МS SQL, но от информацията, която ми давате ми се струва, че може да се е случило следното. Както знаете, стринговете в паметта пристигат unicode-ски. На първи етап (с output-и на няколко char-а от въведените стрингове) трябва да установите, дали в паметта е правилната кирилица - char-a трябва да е от два байта, съответстващи на кирилския символ - първият байт не трябва да е 0, а 04 или нещо такова. Но да допуснем, че кирилицата пристига в паметта правилно. Тогава проблемът Ви може да е само един - системата е настроена за друг дефолтски енкодинг и тъй като от оutput-а личи, че jdbc драйвера прекодира обратно към еднобайтови char-ове, нещата се забозват. Това може да се реши или чрез средства, специфични за API-то ви (като задаване на енкодинг на ниво базов connection). Но това ще направи проектът ви зависим от JDBC драйвера, Разбира се, винаги можете да прекодирате стринга char по char или с nio api-то.
Charset charset = Charset.forName("Cp1251");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
и вместо setXXX в Statement-a за стринга използвате
setAsciiStream(intparameterIndex, InputStreamx, intlength) - така не се минава през reader.
Съответно x e byteArrayInputStream, а byte array-а е дошъл с encoder.encode, оттам имате byte buffer,
Byte array от byte buffer можете да вземете с
byte[] bytes = new byte[len];
ByteBuffer buf = ByteBuffer.wrap(bytes);
А също така, ако java-та ви е под linux, трябва да видите дали има достъп до charsets.jar, иначе това е проблема (и също така
няма да можете да инстанцирате charset)
Ала по-добре решете какво искате и дали слагането на разкодирана 1251 кирилица в базата е точно това, което искате.
Charset charset = Charset.forName("Cp1251");
CharsetDecoder decoder = charset.newDecoder();
CharsetEncoder encoder = charset.newEncoder();
и вместо setXXX в Statement-a за стринга използвате
setAsciiStream(intparameterIndex, InputStreamx, intlength) - така не се минава през reader.
Съответно x e byteArrayInputStream, а byte array-а е дошъл с encoder.encode, оттам имате byte buffer,
Byte array от byte buffer можете да вземете с
byte[] bytes = new byte[len];
ByteBuffer buf = ByteBuffer.wrap(bytes);
А също така, ако java-та ви е под linux, трябва да видите дали има достъп до charsets.jar, иначе това е проблема (и също така
няма да можете да инстанцирате charset)
Ала по-добре решете какво искате и дали слагането на разкодирана 1251 кирилица в базата е точно това, което искате.
Редактирано от Koнcтaнтин Cпиpoв на
Класика в жанра :-)
Едно време от такива проблеми бях решил да нося черно на 24-ти Май, ама бях млад и зелен.
Може да прекодираш стринговете по следния начин:
str = new String(str.getBytes(<client_encoding>), <server_encoding>);
---
In God we Trust (all others must submit a X.509 certificate)
Може да прекодираш стринговете по следния начин:
str = new String(str.getBytes(<client_encoding>), <server_encoding>);
---
In God we Trust (all others must submit a X.509 certificate)
Re: Класика в жанра :-)
Като каза за 24 май се сетих за следния виц:
Въпрос към радио Ереван: Кой е празника на програмистите?
Отговор: 1 Април. Защо ли? Дължим ви обяснение защо, но още не е написано. Честна дума, до няколко дни ще е готово.
Въпрос към радио Ереван: Кой е празника на програмистите?
Отговор: 1 Април. Защо ли? Дължим ви обяснение защо, но още не е написано. Честна дума, до няколко дни ще е готово.