Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java: Общие вопросы > Русские буквы в INSERT


Автор: almagnit 19.5.2008, 13:30
Выполняю команду INSERT и если данные для вставки на ангийском, то проблем не возникает,

а если пытаюсь сохранить в БД русскую информацию, то сервер дает ошибку не корректного символа

потому как JAVA преобразовывает русские буквы в

Код

'\xCA\xF0\xE5\xEF\xE8\xEB...'

при установке соединения устанавливаю кодировку cp1251, просмотрел System properties

везде в кодировках указывается cp1251.

Что приводит к вышеописанному результату?

Автор: v2v 19.5.2008, 13:40
а база данных / таблица с какой кодировкой создана?
 

я бы рекомендовал всюду использовать юникод (UTF-8)...

Автор: almagnit 19.5.2008, 13:48
Цитата(v2v @  19.5.2008,  13:40 Найти цитируемый пост)
а база данных / таблица с какой кодировкой создана?

Цитата(almagnit @  19.5.2008,  13:30 Найти цитируемый пост)
при установке соединения устанавливаю кодировку cp1251

насколько я знаю Unicode в Java используется по умолчанию, а без изменения умолчаний русские буквы

вообще преобразовываются в "?"(знаки вопроса), с этим я столкнулся на предыдущем шаге,

до того как указал в переменной Properties кодировку cp1251.


Автор: LSD 19.5.2008, 14:41
1. Какая база, кодировка базы, какой драйвер используется?
2. Как формируется insert, с подстановочными параметрами или без?

Автор: almagnit 19.5.2008, 14:49
Цитата(LSD @  19.5.2008,  14:41 Найти цитируемый пост)
1. Какая база, кодировка базы, какой драйвер используется?

1. MySQL, cp1251, jConnector.

Цитата(LSD @  19.5.2008,  14:41 Найти цитируемый пост)
2. Как формируется insert, с подстановочными параметрами или без?

2. Без параметров.

ЗЫ:
Повторюсь, при работе с английским текстом все впорядке.

Автор: LSD 19.5.2008, 14:59
Попробуй с подстановочными параметрами.

Автор: almagnit 19.5.2008, 15:14
Цитата(LSD @  19.5.2008,  14:59 Найти цитируемый пост)
Попробуй с подстановочными параметрами.

Строка с текстом команды не выполняется SQL сервером, из-за того что Java изменяет русский

текст как в строке запроса браузера.

ЗЫ:
Я не очень силен в SQL, поправьте если я неправильно понял определение "подстановочных параметров".

Автор: v2v 19.5.2008, 16:11
я так понимаю имелось ввиду 
Код

        String sql = "INSERT INTO my_table (col_string) VALUES(?)";
        PreparedStatement pstmt = connection.prepareStatement(sql);
        pstmt.setString(1, "значение 1 на русском языке");

Автор: almagnit 19.5.2008, 19:17
Не вижу взаимодействия PreparedStatements и выходной кодировки. Соответственно результат

не изменился

Код

'\xCA\xF0\xE5\xEF\xE8\xEB...'


Еще разобрался что ошибка не в неправильном написании кода, потому как  последняя моя программа 

работавшая без ошибок сейчас отказывается добавлять информацию в БД на русском языке.

Может быть что-то с ПО. Я пользуюсь 

- mysql-5.0.45-win32 (при настройке конфигурации выбираю cp1251);

- mysql-connector-java-5.0.6

- jre1.5.0_15

вот системные параметры JRE:

Код

java.runtime.name=Java(TM) SE Runtime Environment
sun.boot.library.path=C:\Program Files\Java\jre6\bin
java.vm.version=11.0-b11
java.vm.vendor=Sun Microsystems Inc.
java.vendor.url=http://java.sun.com/
path.separator=;
java.vm.name=Java HotSpot(TM) Client VM
file.encoding.pkg=sun.io
user.country=RU
sun.java.launcher=SUN_STANDARD
sun.os.patch.level=Service Pack 2
java.vm.specification.name=Java Virtual Machine Specification
user.dir=E:\Проекты\JAVA1\Grafic
java.runtime.version=1.6.0_10-beta-b14
java.awt.graphicsenv=sun.awt.Win32GraphicsEnvironment
java.endorsed.dirs=C:\Program Files\Java\jre6\lib\endorsed
os.arch=x86
java.io.tmpdir=C:\DOCUME~1\HOME\LOCALS~1\Temp\
line.separator=

java.vm.specification.vendor=Sun Microsystems Inc.
user.variant=
os.name=Windows XP
sun.jnu.encoding=Cp1251
java.library.path=C:\Program Files\Java\jre6\bin;.;C:\W...
java.specification.name=Java Platform API Specification
java.class.version=50.0
sun.management.compiler=HotSpot Client Compiler
os.version=5.1
user.home=C:\Documents and Settings\HOME
user.timezone=
java.awt.printerjob=sun.awt.windows.WPrinterJob
file.encoding=Cp1251
java.specification.version=1.6
user.name=HOME
java.class.path=E:\Проекты\JAVA1\Grafic\bin
java.vm.specification.version=1.0
sun.arch.data.model=32
java.home=C:\Program Files\Java\jre6
java.specification.vendor=Sun Microsystems Inc.
user.language=ru
awt.toolkit=sun.awt.windows.WToolkit
java.vm.info=mixed mode, sharing
java.version=1.6.0_10-beta
java.ext.dirs=C:\Program Files\Java\jre6\lib\ext;C:...
sun.boot.class.path=C:\Program Files\Java\jre6\lib\resour...
java.vendor=Sun Microsystems Inc.
file.separator=\
java.vendor.url.bug=http://java.sun.com/cgi-bin/bugreport...
sun.cpu.endian=little
sun.io.unicode.encoding=UnicodeLittle
sun.desktop=windows
sun.cpu.isalist=pentium_pro+mmx pentium_pro pentium+m...


Что же так повлияло на работу соединения ?

Автор: almagnit 19.5.2008, 20:42
Цитата(v2v @  19.5.2008,  13:40 Найти цитируемый пост)
я бы рекомендовал всюду использовать юникод (UTF-8)...

Да ты был прав. Блин пол дня потратил на отладку этой ерундовины, плюс один - начитался всего чего можно.

Это при обработке полученных данных на русском языке нужно изменять кодировку через new String(data, "cp1251").

А при записи эта кодировка лишняя.

ЗЫ:
Ну надо же было ...  smile 

Автор: LSD 20.5.2008, 15:39
Цитата(almagnit @  19.5.2008,  20:17 Найти цитируемый пост)
Не вижу взаимодействия PreparedStatements и выходной кодировки.

А он и не должен, за преобразование данных отвечает драйвер. Раз он этого не сделал, значит неправильные установки соединения/базы.

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