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


Автор: schmidt 10.6.2009, 23:45
Доброго времени суток!

Есть база данних, в которой есть таблица professor, туда мне надо сейвить преподов с кириличной информацией. Когда вставляю запись в базу данних через пхпМайАдмин или через конольку, то все нормально с кодировками, работает то, что при создании базы данных я прописал set charset cp1251. 
Но когда я передаю данних о преподе через веб форму серелету-контроллеру, который потом передает это Хибернейту засейвить, то  получаю ексепшин:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'first_name' at row 1
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3374)


в поле first_name я вводил кирилицей

Автор: 5ad1sT 11.6.2009, 00:09
Цитата(schmidt @ 10.6.2009,  23:45)
Доброго времени суток!

Есть база данних, в которой есть таблица professor, туда мне надо сейвить преподов с кириличной информацией. Когда вставляю запись в базу данних через пхпМайАдмин или через конольку, то все нормально с кодировками, работает то, что при создании базы данных я прописал set charset cp1251. 
Но когда я передаю данних о преподе через веб форму серелету-контроллеру, который потом передает это Хибернейту засейвить, то  получаю ексепшин:

com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column 'first_name' at row 1
    com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3374)


в поле first_name я вводил кирилицей

Мне кажется что тут проблема не в кодировке.. у тебя поле в базе ограниченного размера по символам, а ты туда заносиш слишком длинное слово/словосочетание..

Автор: schmidt 11.6.2009, 00:32
Когда английскими вводишь, То все нормально - сейвит. А поля в базе я всюда ставил на варЧар по 256 символов

Автор: Vasay 11.6.2009, 00:44
schmidt, 

От cp1251 я бы отказался в пользу UTF-8

Посмотрите тему, может поможет:
http://forum.vingrad.ru/forum/topic-173998/unread-1/hl/mysql/index.html

Автор: Старовъръ 13.6.2009, 17:41
schmidt, ты б в дебагере глянул, может в сервлет данные приходят битые.

Автор: ShurikA 14.6.2009, 09:24
schmidt, 

По моему дело всё в том что когда сервер получает кирилицу букбы превращаутся в ASCII коды, а они как известно не один знак (пробел это   на пример. Вот и получается у тебя очень длинное поле.
Попробый загнать в базу чтонибудь очень короткое, и посмотри.

Автор: Старовъръ 14.6.2009, 10:07
Цитата
а они как известно не один знак
Они, как известно, один байт ;)
В общем нужно ждать топикстартера)

Автор: ShurikA 14.6.2009, 10:49
Цитата(Старовъръ @  14.6.2009,  09:07 Найти цитируемый пост)
Они, как известно, один байт

это латинские буквы один байт smile А кирилица транслируется на пример в 4

Автор: Старовъръ 14.6.2009, 11:23
Кол-во байт определяет кодировка. Юникод, в котором присутствуют и русские буквы, использует 2 байта для кодирования одного символа, не зависимо от того, английский это символ или китайский. 
ASCII - это не кодировка, это цифровое представление символов. На этой таблице базируется большинство(если не все) кодировки. В табице ASCII есть представление только английского алфавита. Всего там 128 символов.

Автор: ShurikA 14.6.2009, 11:26
Цитата(Старовъръ @  14.6.2009,  10:23 Найти цитируемый пост)
ASCII - это не кодировка, это цифровое представление символов. На этой таблице базируется большинство(если не все) кодировки. В табице ASCII есть представление только английского алфавита. Всего там 128 символов. 

pрав, извини, сморозил...

Автор: schmidt 14.6.2009, 16:38
В сервлет данные приходят корректно: вывожу параметры в файл - все корректно, все правильно. Но, получается, когда сервелт их передает классу ProfessorDAO, который делает сейв в базу, то в базе они отображаются некорректно.
Напишу еще раз последовательность сохранения:
Есть класс Professor - сущность, в которой инкапсулируются данние о профессоре
Есть класс ProfessorDAO - клас, в котором определен метод 
Код

public void saveProfessor(Professor professor){
        hibernateTemplate.save(professor);
    }

Вот сервлет и вызывает этот метод для сейва профессора в базе данных.

Все равно в базе данных при просмотре отображаются знаки вопросов...

Автор: ShurikA 16.6.2009, 03:11
Цитата(schmidt @  14.6.2009,  15:38 Найти цитируемый пост)
Все равно в базе данных при просмотре отображаются знаки вопросов... 

Вот это как раз наводит на мысль что есть проблемма с кодиривкой. Думаю UTF-8 поможет.

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