Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Hibernate+MySQL правильная кодировка


Автор: kkorsakoff 3.10.2006, 13:35
Использую Hibernate и автоматическое генерирование схемы. 
Для "обычных" String в случае MySQL получается примерно такая строка 

`username` varchar(255) character set latin1 NOT NULL default ''

Соответственно при записи кириллицы пишутся всем до боли знакомые знаки вопросовsmile

Не пойму откуда берется latin1, и самое главное, где можно задать нужную кодировку (мне надо utf8).

Автор: tux 3.10.2006, 13:47
Вот это:
Цитата(kkorsakoff @  3.10.2006,  18:35 Найти цитируемый пост)
`username` varchar(255) character set latin1 NOT NULL default ''

откуда? Из дампа базы или это реально Hibernate такое сгенерировал?

Автор: kkorsakoff 3.10.2006, 17:50
Из консоли mysql> show create table users.
Подозреваю, что это придумал Hibernate.
В принципе даже не суть важно откуда это. Как мне работать с кириллицей?smile

Автор: Slavca 3.10.2006, 18:56
Я не пользовал hibernate, но нельзя ли в пропертях подключения к БД указать кодировку?
В доке по connector'у для MySql написано:
Код

To allow multiple character sets to be sent from the client, the "UTF-8" encoding should be used,
either by configuring "utf8" as the default server character set, or by configuring the JDBC driver
to use "UTF-8" through the characterEncoding  property.

Можно при подключении в url указать:
jdbc:mysql://localhost/database_name?characterEncoding=utf8

Поправьте, если не прав.

Автор: kkorsakoff 3.10.2006, 19:18
Указано давным давно. Даже для таблицы прописал DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Тут дело немного  в другом, сами столбцы стоят в latin1. Тут уже кодировка коннекшена не причем.

Автор: 3x3 4.10.2006, 00:26
Цитата(kkorsakoff @ 3.10.2006,  19:18)
Указано давным давно. Даже для таблицы прописал DEFAULT CHARSET=utf8 COLLATE=utf8_bin
Тут дело немного  в другом, сами столбцы стоят в latin1. Тут уже кодировка коннекшена не причем.

Взял одну из тестовых таблиц и добавил к ней поле в вашей излюбленной кодировке:
Код

ALTER TABLE `xtest` ADD `comment` varchar(255) character set latin1 NOT NULL default ''


Посмотрел чиво получилось:

Код

select COLUMN_NAME, CHARACTER_SET_NAME, COLLATION_NAME from information_schema.columns where table_name='XTEST';


Получилось что и требовалось: старые столбцы в юникоде, а этот новый - в латинице.

Сделал так:
Код

ALTER TABLE `xtest` MODIFY `comment` varchar(255) character set 'utf8' NOT NULL default ''


И стали все столбцы в юникоде.

Классная штука этот ваш MySQL: заглянешь в мануал - и сразу понятно что следует делать в той или иной ситуации smile

Автор: kkorsakoff 4.10.2006, 12:57
Вопрос не в том, как на уже готовой базе поменять кодировку. Спасибо конечно, но это не вызвало затруднений у меняsmile

Но задача заключается в том, чтобы Hibernate _САМА_ создавала схему, указывая MySQL что кодировка таблиц и столбцов utf8, а не latin1

Автор: Slavca 4.10.2006, 17:22
Мануал, как много в этом слове для сердца разработчика...
На вот этой страничке
http://dev.mysql.com/doc/refman/4.1/en/create-table.html
написано:
Код

table_option:
...
  | [DEFAULT] CHARACTER SET charset_name


Если я опять не угадал, то ты уж приведи кусочки кода.

Автор: kkorsakoff 4.10.2006, 21:32
Возник вопрос: а отвечающие вообще когда-нибудь пользовались Hibernate и автоматической генерацией схемы? Зачем отвечать, не зная сути.

Автор: tux 5.10.2006, 06:44
Нашел наконец немного времени попробовать сгенерировать схему из Hibernate в MySQL. Знаешь, похоже не в Hibernate дело. Он вообще не вставляет в сгенерированный скрипт никаких кодировок какие настройки не устанавливай. Думаю, ты уже наверняка проверил кодировку БД. В общем теряюсь в догадках. Может быть при старте MySQL или в my.ini задается latin1 как дефолтная кодировка?

Автор: sandello 5.10.2006, 07:51
По собственному опыту - кодировка в MySQL та еще песня о главном :-)
Когда надоело бодаться установил в настройках сервера кодировку для по умолчанию для сервера, для коннекта, etc:
%grep -i utf /etc/my.cnf
character-set-server = utf8
default-character-set = utf8

Вроде проблема решилась :-)

Автор: kkorsakoff 5.10.2006, 10:29
Это хорошо, но админ не разрешил установить кодировку для сервераsmile
У него на это видимо есть свои админские причины.
Да, hibernate ничего не вставляет (смотрел generated sql), но я думал, может есть способ заставить его это сделать.
Видимо прийдется при загрузке приложения выполнять alter table ....

Все равно спасибо за посильную помощь! smile 

Автор: 3x3 5.10.2006, 12:50
Цитата(kkorsakoff @ 5.10.2006,  10:29)
я думал, может есть способ заставить его это сделать.


А до этого ты писал:
Цитата

Подозреваю, что это придумал Hibernate.


И ругался на тех, кто не прочел твои мысли правильно:

Цитата

Зачем отвечать, не зная сути.



M
batigoal
Посто отредактирован. Больше сдержанности. У-саа....

Автор: kkorsakoff 8.12.2006, 13:36
Да, кстати по поводу решения.
Пришлось вручную делать alter table ... DEFAULT CHARSET=utf8 COLLATE=utf8_bin 
Видимо иначе никак. Ну или как сказал sandello - установить кодировку для сервера целиком.

Автор: Wowa 26.2.2007, 15:57
Цитата(kkorsakoff @  8.12.2006,  11:36 Найти цитируемый пост)
Видимо иначе никак. Ну или как сказал sandello - установить кодировку для сервера целиком. 

Можно и даже нужно после коннекта к базе давать запрос "SET NAMES utf8". Тогда серверные настройки кодировки мускула не будут иметь для тебя значения.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)