Кирилица през JDBC драйвер за SQL Server

60 views
Skip to first unread message

Daniel Dimov

unread,
Jun 24, 2022, 4:31:01 AM6/24/22
to Bulgarian Java Users Group
Здравейте всички,

имам много неприятен проблем с извличането на текстове на кирилица с JDBC драйвера на Microsoft... До тук съм пробвал всички "решения", които могат да се намерят в Итернет и се оказва, че не са решения. Пробвах различни версии на драйвера - при всичките резултата е един и същ. Самите драйвери работят коректно защото примерно Squirrel SQL си работи чудесно с тях. Въпроса е как го правят? Какъв е правилния начин за прочитане на текстове на кирилица от MS SQL Server ?

Сигурен съм, че който се е сблъсквал с този проблем - веднага ще се сети за какво става въпрос...

Благодаря!
Даниел

Martin Toshev

unread,
Jun 24, 2022, 6:46:16 AM6/24/22
to bg-...@googlegroups.com
    Здравей, 
    Проблемът според не е в драйвър-а, ами в четенето на данните от базата (напр. encoding-a). Пробвал ли си да подадеш characterEncoding=UTF-8 в connection string-a ? (i.e. jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8) ?
    Поздрави,
    Марто


--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/08935be1-71ed-4d45-914f-812c967bfe89n%40googlegroups.com.

Daniel Dimov

unread,
Jun 24, 2022, 6:52:54 AM6/24/22
to Bulgarian Java Users Group
Става въпрос за Microsoft SQL Server.   Не MySQL !

Д

Martin Toshev

unread,
Jun 24, 2022, 7:10:10 AM6/24/22
to bg-...@googlegroups.com
   Здравей, Даниел,
   Няма значение понеже mssql driver-a изглежда поддържа същата опция (mysql просто като пример го дадох). Даже може да пробваш със следните параметри към connection string-a: useUnicode=true;characterEncoding=UTF-8.
   Поздрави,
   Марто


За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/6b195482-1310-4fcf-81ce-141439405822n%40googlegroups.com.

Daniel Dimov

unread,
Jun 24, 2022, 7:28:17 AM6/24/22
to Bulgarian Java Users Group
Пробвах, но - не - нямат ефект тези параметри. Нещо друго е принципно различно, което трябва да се направи... Тези драйвери нямат charset converter (каквито някои други драйвери имат)

Д

Milen Dyankov

unread,
Jun 24, 2022, 8:52:46 AM6/24/22
to Bulgarian Java Users Group
"Правилния начин за прочитане на текстове на кирилица от MS SQL Server" зависи от това как са записани текстове ;)
 
Първо провери какъв е character encoding'a на базата/таблицата/полето което четеш. Mоже да не е Unicode/UTF-8 а някакво ASCII базирано кодиране, 
Не съм специалист от MSSQL но всички бази с които съм работил имаt някакви системни таблици или meta модел или команди които дават тази информация.
Като знаеш какво точно е кодирането, трябва да конфигурираш драйвера да ползва такова.  

Предполагам че решенията за които пишеш че работят (Squirrel SQL ) правят точно това. 

Daniel Dimov

unread,
Jun 24, 2022, 9:43:52 AM6/24/22
to Bulgarian Java Users Group
Никъде не намирам такава информация. Но какъвто и да е този encoding - вече пробвах с всички, които драйвера поддържа/разпознава и резултата е един и същ.  Те са {"UTF-16LE", "Cp437", "Cp850", "MS874", "MS932", "MS936", "MS949", "MS950", "Cp1250", "Cp1251", "Cp1252", "Cp1253", "Cp1254", "Cp1255", "Cp1256", "Cp1257", "Cp1258"}

Nayden Gochev

unread,
Jun 24, 2022, 10:08:46 AM6/24/22
to bg-...@googlegroups.com

Здравейте, мога да кажа следното за MySQL .

 

spring.datasource.url=jdbc:mysql://localhost:3306/jprime?autoReconnect=true&createDatabaseIfNotExist=true&useUnicode=true&characterEncoding=UTF-8&connectionCollation=utf8_general_ci&characterSetResults=utf8&autoDeserialize=tru

 

Взето от сайта на jprime https://github.com/bgjug/jprime/blob/master/src/main/resources/application.properties

 

ВАЖНО е все пак и когато създаваш БАЗАТА/ таблицата да кажеш, че е UTF8 ...

  • CREATE DATABASE drmartens2011x CHARACTER SET utf8 COLLATE utf8_general_ci;

 


Вероятно SQL Server е подобен … хем трявба при създаване на базата да кажеш, и после същото в driver stringa.

 

Нямам пример с SQL Server, но както и Милен каза… въпроса е КАК си създал базата 😊 не е само до четене.

 

 

 

Nayden Gochev

Superhero with Java Powers!

Software Consultant, Speaker

m:

+359 883 486 214

a:

Sofia, Bulgaria

l:

https://linkedin.com/in/gochev                                              

e:

goc...@gmail.com                                             

 

 

From: Martin Toshev
Sent: 24 June 2022 14:10
To: bg-...@googlegroups.com
Subject: Re: [bg-jug] Кирилица през JDBC драйвер за SQL Server

 

   Здравей, Даниел,

   Няма значение понеже mssql driver-a изглежда поддържа същата опция (mysql просто като пример го дадох). Даже може да пробваш със следните параметри към connection string-a: useUnicode=true;characterEncoding=UTF-8.

   Поздрави,

   Марто

 

 

На пт, 24.06.2022 г. в 13:52 ч. Daniel Dimov <danie...@gmail.com> написа:

Става въпрос за Microsoft SQL Server.   Не MySQL !

 

Д

On Friday, June 24, 2022 at 1:46:16 PM UTC+3 martin.toshev wrote:

    Здравей, 

    Проблемът според не е в драйвър-а, ами в четенето на данните от базата (напр. encoding-a). Пробвал ли си да подадеш characterEncoding=UTF-8 в connection string-a ? (i.e. jdbc:mysql://localhost:3306/dbName?characterEncoding=UTF-8) ?

    Поздрави,

    Марто

 

 

На пт, 24.06.2022 г. в 11:31 ч. Daniel Dimov <danie...@gmail.com> написа:

Здравейте всички,

 

имам много неприятен проблем с извличането на текстове на кирилица с JDBC драйвера на Microsoft... До тук съм пробвал всички "решения", които могат да се намерят в Итернет и се оказва, че не са решения. Пробвах различни версии на драйвера - при всичките резултата е един и същ. Самите драйвери работят коректно защото примерно Squirrel SQL си работи чудесно с тях. Въпроса е как го правят? Какъв е правилния начин за прочитане на текстове на кирилица от MS SQL Server ?

 

Сигурен съм, че който се е сблъсквал с този проблем - веднага ще се сети за какво става въпрос...

 

Благодаря!

Даниел

--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.

За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un..@googlegroups.com.


За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/08935be1-71ed-4d45-914f-812c967bfe89n%40googlegroups.com.

--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/6b195482-1310-4fcf-81ce-141439405822n%40googlegroups.com.

--
Получихте това съобщение, защото сте абонирани за групата „Bulgarian Java Users Group“ в Google Групи.
За да се отпишете от тази група и да престанете да получавате имейли от нея, изпратете имейл до bg-jug+un...@googlegroups.com.

За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/CAJQxrXBkN6N-_0wjXjv7UwS9Nfte%2BLDCBYBQYz2wOkXKH1vfmw%40mail.gmail.com.

 

Milen Dyankov

unread,
Jun 24, 2022, 11:16:01 AM6/24/22
to Bulgarian Java Users Group
> Никъде не намирам такава информация ...

Едно бързо търсене ми намери това: https://social.msdn.microsoft.com/Forums/sqlserver/en-US/07ec27a2-043b-4fc7-8804-5286378e4f25/how-do-i-check-if-my-mssql-database-is-unicode?forum=sqlsetupandupgrade

Daniel Dimov

unread,
Jun 24, 2022, 11:32:30 AM6/24/22
to Bulgarian Java Users Group
Базата е създадена отдавна и не от мен, така че тя за мен е даденост и не мога да я променям. Създадена е с collation Cyrillic_General_CI_AS - това най-вероятно означава кодиране на стринговете по CP1251

Д

Martin Toshev

unread,
Jun 24, 2022, 1:32:11 PM6/24/22
to bg-...@googlegroups.com
   Щом казваш, че Squirrel SQL чете правилно данните, значи не е от базата. А Squirrel SQL изглежда дефинира стандарна JDBC връзка: https://github.com/aihua/squirrel-sql/blob/8794fcedf1a0020347459a95f44bb445bbfa67b8/sql12/core/src/net/sourceforge/squirrel_sql/client/resources/defaults/default_drivers.xml:

<Bean Class="net.sourceforge.squirrel_sql.fw.sql.SQLDriver">
<driverClassName>com.microsoft.sqlserver.jdbc.SQLServerDriver</driverClassName>
<identifier Class="net.sourceforge.squirrel_sql.fw.id.UidIdentifier">
<string>-11</string>
</identifier>
<jarFileName/>
<jarFileNames Indexed="true"/>
<name>Microsoft MSSQL Server JDBC Driver</name>
<url>jdbc:sqlserver://&lt;server_name&gt;:1433;databaseName=&lt;db_name&gt;</url>
<websiteUrl>http://msdn.microsoft.com/sql</websiteUrl>
</Bean>
Да не би да използваш по-стара версия на MSSQL JDBC driver-a ? Също ако е възможно изпрати версия на драйвъра и code snippet, защо така разсъждаваме и малко насляпо ...
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/1aba434f-11e8-456f-a24b-46e0546dcafcn%40googlegroups.com.

Nayden Gochev

unread,
Jun 24, 2022, 1:55:14 PM6/24/22
to bg-...@googlegroups.com
Можеш да си видиш connection stringa в squarel sql
From: bg-...@googlegroups.com <bg-...@googlegroups.com> on behalf of Martin Toshev <mart...@gmail.com>
Sent: Friday, June 24, 2022 8:31:57 PM
To: bg-...@googlegroups.com <bg-...@googlegroups.com>
За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/CAJQxrXBvqdUhpKFk%2B96NZVw0pReUQQBJdt%3DfY0SaK3kqUTzFhA%40mail.gmail.com.

Daniel Dimov

unread,
Jun 24, 2022, 2:08:23 PM6/24/22
to Bulgarian Java Users Group
До тук съм пробвал със следните версии на драйвера: 4, 6.2.2.jre8 и 7.2.2.jre8  - с всички версии резултата е един и същ - всеки символ на кирилицата излиза като ?

На Squirrel SQL съм сложил драйвер версия 4 - работи си чудесно. Взех connection string-а от програмата, но всичко продължава да си е все същото.

Кода с който тествам е:
String connect = "jdbc:sqlserver://" + host + ":1433;databaseName=" + dbname;
Properties props = new Properties();
props.put("user", user);
props.put("password", pass);

try (Connection con = DriverManager.getConnection(connect, props)) {
    Statement stmt = con.createStatement();
    ResultSet rs = stmt.executeQuery("select id, [name] from companydealer");

    while (rs.next()) {
        int id = rs.getInt(1);
        String name = rs.getNString(2);
        System.out.println(String.format("DEALER: %d %s", id, name));
    }

    stmt.close();
} catch (SQLException e) {
    e.printStackTrace();
}

Alexander Shopov

unread,
Jun 24, 2022, 3:28:50 PM6/24/22
to bg-...@googlegroups.com
А защо не пробвате стъпка по стъпка?
1. Проверете какви са настройките на сървъра: SELECT * FROM sys.databases
2. Проверете какви са настройките на осъществената връзка SQLServerDatabaseMetaData.getUrl() (и др. методи от класа - getConnection().getProperty() )
3. Проверете дали всъщност не получавате кирилски данни, а нещо друго да прави прекодирането до неизвестен знак със ?. Примерно equals() на сигурна стойност или извеждане на байтовете на низа. Случвало се е текстовия редактор, конзолата и мн. др. да не са настроени правилно. Просто SQL Squirrel може да извежда нещата правилно.

Поздрави:
ал_шопов

За да видите тази дискусия в мрежата, посетете https://groups.google.com/d/msgid/bg-jug/ad1ca7f6-3393-48f6-9d7d-0a827f215663n%40googlegroups.com.

Daniel Dimov

unread,
Jun 25, 2022, 10:21:52 AM6/25/22
to Bulgarian Java Users Group
Не получавам кирилски данни - като извадя байтовете от стринга, който получавам - навсякъде където има въпросителна кода е 3F. Всичко останало (латиницата, цифрите и другите символи) се чете коректно.

Очевидно е, че драйвера не декодира правилно кирилицата когато е настроен по дефолт. Иначе може да я даде правилно, но аз (и въобще всички ние) не знам как да го настроя, така че да я даде правилно.

Alexander Shopov

unread,
Jun 25, 2022, 11:21:18 AM6/25/22
to bg-...@googlegroups.com
Не получавам кирилски данни - като извадя байтовете от стринга, който получавам - навсякъде където има въпросителна кода е 3F. Всичко останало (латиницата, цифрите и другите символи) се чете коректно.
Очевидно е, че драйвера не декодира правилно кирилицата когато е настроен по дефолт. Иначе може да я даде правилно, но аз (и въобще всички ние) не знам как да го настроя, така че да я даде правилно.
Съжалявам, не съм работил с MSSQL през JDBC и съответно предложенията ми са от съвсем общо естество. Надявам се не преча, а помагам.

1. Не виждам документирана настройка за кодирането в адреса при свързване:
Може би единствено sendStringParametersAsUnicode има нещо общо, но тя стандартно е true, а и важи при пращане, а не получаване на данни.
2. Не откривам и нищо в настройките към връзката на драйвера в изходния код на SQLServerDriver.java
3. Както в други драйвери SQLServerResultSet предоставя два варианта за получаване на данна: getТИП и getNТИП - примерно getString и getNSting - те ползват различно кодиране - JDBCType.CHAR и JDBCType.NCHAR, но виждам в дадения пример, че сте ползвали точно това:
String name = rs.getNString(2);

Това е пределът на знанията ми, съжалявам. Единствено се сещам да сложите точка на прекъсване в дебъгера още на ниво драйвер и да видите не се ли чупи нещо там.

Поздрави:
ал_шопов

 
Reply all
Reply to author
Forward
0 new messages