Новости
Документация
Download
Webboard
Поиск
FAQ/ЧаВо
Обратная связь




MySQL.RU - Webboard



Вернуться
JDBC, MySQL 4.1.8 & cp1251 (Виктор) 07/01/2005 - 13:14:18
      Re: Illegal mix of collations (Виктор) 07/01/2005 - 13:18:33
      Re: JDBC, MySQL 4.1.8 & cp1251 (Кирилл) 11/01/2005 - 01:28:15
      Re: useUnicode=true&characterEncoding=cp1251 (Виктор) 12/01/2005 - 09:36:01
      Re: Зарегистрировал (Виктор) 01/02/2005 - 14:00:43



From: Виктор - 07/01/2005 - 13:14:18
Subject:JDBC, MySQL 4.1.8 & cp1251
-----------------
Здравствуйте, уважаемые!

Хочу поднять вопрос о корректности работы JDBC-драйвера (Connector/J версии 3.1.x) с сервером MySQL (версия 4.1.x) при установленной на сервере кодировке cp1251.

Сразу скажу, что я изначально не мог в это поверить, но как говориться против исходников и отладки не попрешь. В интернете я так и не нашел обсуждения подобного поведения. Может плохо искал?

Ситуация такова:
1.MySql 4.1.8 (кодировка cp1251).
2.Connector/J версии 3.1.5, 3.1.6 или 3.2.0 (другие не смотрел).

Если верить документации JDBC-драйвер должен сам определять кодировку установленную на сервере по значению переменной «character_set_server». См. Раздел «Character Sets and Unicode»:

«The character encoding between client and server is automatically detected upon connection. The encoding used by the driver is specified on the server via the configuration variable 'character_set' for server versions older than 4.1.0 and 'character_set_server' for server versions 4.1.0 and newer. See the "Server Character Set and Collation" section in the MySQL server manual for more information.»

При попытке соединения JDBC драйвер выдает следующее:

7 Connect root@192.168.1.120 on test
7 Query SET NAMES latin1
7 Query SET character_set_results = NULL
7 Query SHOW VARIABLES
7 Query SHOW COLLATION
7 Query SET autocommit=1

Я стал разбираться откуда берется «SET NAMES latin1» и нашел следующее:

1.В методе doHandshake (com.mysql.jdbc.MysqlIO) сервер передает клиенту код кодировки serverCharsetIndex = 51. Это есть правильно.
2.Обрабатывая этот код драйвер использут класс com.mysql.jdbc.CharsetMapping следующим образом CharsetMapping.INDEX_TO_CHARSET[this.io.serverCharsetIndex] и это тоже есть правильно, т.к. код 51 соответствует в INDEX_TO_CHARSET значению «cp1251cias».
3.Далее драйвер пытается по значению кодировки «cp1251cias» получить mysqlEncodingName (примерно так mysqlEncodingName = (String) CharsetMapping.JAVA_UC_TO_MYSQL_CHARSET_MAP.get(getEncoding().toUpperCase(Locale.ENGLISH));)
4.Вот тут проблема CharsetMapping.JAVA_UC_TO_MYSQL_CHARSET_MAP не содержит «cp1251cias»!

Как такое может быть? Это что недоработка? Из версии в версию? Включая релиз? При попустительстве русскоязычного сообщества? Или я чего не понимаю? Или никто не работает с cp1251? И собственно, что за cp1251cias? Зачем так сложно? Или просто начали и не успели дописать?

Решается все просто:

Добавляем в CharsetMapping.java строку

tempMap.put("cp1251cias", "Cp1251");

и все начинает работать правильно. Пропатченный JAR у меня есть. Да любой это и сам может сделать.

Кто что скажет?
Или я не туда? :)


[Это сообщение - спам!]

Последние сообщения из форума

Уважаемые посетители форума MySQL.RU!
Убедительная просьба, прежде чем задавать свой вопрос в этом форуме, обратите внимание на разделы:
- ответы на наиболее часто задаваемые вопросы - FAQ
- раздел документация
- раздел поиск по сообщениям форума и документации
Также, старайтесь наиболее подробно указывать свою ситуацию (версию операционной системы, версию MySQL, версию программного обеспечения, по которому возникает вопрос, текст возникающих ошибок, и др.)
Помните, чем конкретнее Вы опишете ситуацию, тем больше шансов получить реальную помощь.
 Имя:
 E-mail:
 Тема:
 Текст:
Код подтверждения отправки: Code
19859



РЕКЛАМА НА САЙТЕ
  Создание сайтов | |