powered by simpleCommunicator - 2.0.60     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / При записи во внешнюю базу слетает кодировка
9 сообщений из 9, страница 1 из 1
При записи во внешнюю базу слетает кодировка
    #36974811
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
- Cache for UNIX (SUSE Enterprise Server for x86-64) 2010.1.1 (Build 503U) Fri Apr 2 2010 23:12:30 EDT
- локаль rusw
- Внешняя база MySQL, кодировка UTF8
- Доступ по JDBC, пробовал перекодировать:
Код: plaintext
s query = "update goods set name_goods = '"_$zcvt(msg.Name,"O","UTF8")_"'"
не помогает.
- При чтении все нормально.

Подскажите, что еще смотреть, настраивать?
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36974912
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Используйте параметризованные запросы:
Код: plaintext
s query = "update goods set name_goods = ?"
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36974982
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

С параметрами какбэ есть проблема... Лезу в базу так (не спрашивайте почему, это отдельная тема):
Код: plaintext
1.
2.
3.
s conn = $$GetJConnection^%apiGTW(gatewayName)
s stmt = %JDBCGateway.prepareStatement(conn, query)
s tSC = %JDBCGateway.execUpdate(stmt)
Куда здесь параметры передавать, ума не приложу...
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36975128
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Для параметризованных запросов используйте метод prepareStatement , например:

Class ORACLE.test Extends %RegisteredObject
{

ClassMethod Test(
  host As %String = "127.0.0.1",
  port As %Integer = {$$$JDBCGatewayPort}) As %Status
{
  #dim exception As %Exception.StatusException
  set url="jdbc:oracle:thin:@сервер:порт:схема"
  set username="логин"
  set password="пароль"
  #dim classPath As %ListOfDataTypes=##class(%ListOfDataTypes).%New()
  ; каталог с jar-файлами драйвера Oracle
  do classPath.Insert("C:\jdbc\oracle\")
  try {
    #dim gateway As %Net.Remote.Gateway=##class(%Net.Remote.Gateway).%New()
    ; подключаемся к шлюзу
    $$$ThrowOnError(gateway.%Connect(host,port,,,classPath))
    $$$ThrowOnError(gateway.%ClassForName("oracle.jdbc.OracleDriver"))
  
    #dim connection As java.sql.Connection=##class(java.sql.DriverManager).getConnection(gateway,url,username,password)
    #dim statement As java.sql.PreparedStatement=connection. prepareStatement ("update test set str=? where id=?")
    do statement.setString(1,"Стро'ковое 'зна""чение")
    do statement.setLong(2,1)
    #dim rs As java.sql.ResultSet=statement. executeQuery ()
  
    $$$ThrowOnError(gateway.%Disconnect())
  } catch exception {
    ; выводим текст ошибки на русском языке
    write $system.Status.GetErrorText(exception.AsStatus(),"ru")
  }
}
}


coder1cv8С параметрами какбэ есть проблема... Лезу в базу так (не спрашивайте почему, это отдельная тема):
Хорошо, не буду.
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36976503
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

Что-то не получается у меня с параметрами (
Пишу:
Код: plaintext
1.
2.
3.
4.
5.
s simple = "insert goods set id_goods = 33, name_goods = ?"
s stmt = gw.prepareStatement(conn, simple)
$$$LOGINFO("Is object: "_$ISOBJECT(stmt))
d stmt.setString( 1 , msg.Name)
s tSC = gw.execUpdate(stmt)
$ISOBJECT(stmt) возвращает 0 и соответственно дальше ничего не идет.

Пробовал добавить перед запросом "set names utf8;" по идее должно помогать, но в таком варианте insert вообще перестает работать, хотя ошибок при выполнении не возникает.
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36976549
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Что-то я вообще ничего не понимаю...
PreparedStatement и не должен быть объектом? Потому что $ISOBJECT(stmt) всегда возвращает 0, независимо от текста запроса.

Я думал загвоздка в этом, потому что дальше ругается на <INVALID OREF> при установке параметра:
ОШИБКА <Ens>ErrException: <INVALID OREF>zinsertItem+18^ru.packagename.adapters.MySQLOutboundAdapter.4 -- - зарегистрировался как '25 Nov 2010' номер 8 @' d stmt.setString(1, msg.Name)'
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36976782
coder1cv8
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Проблема с кодировкой решена.
Если кому-то будет нужно, решается установкой параметров соединения:
useUnicode=true&characterEncoding=UTF-8&characterSetResults=UTF-8
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36978701
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
coder1cv8 ,

Если Вы формируете текст запроса к СУБД вручную, то не забудьте делать проверку входных параметров в целях борьбы с SQL injection
Кто-нибудь проверял каше на уязвимости через SQL injection?
...
Рейтинг: 0 / 0
При записи во внешнюю базу слетает кодировка
    #36979469
Фотография DAiMor
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
servit,

а что проверять понятное дело что если использовать параметризованные запросы, то никакие sql-инъекции не страшны, потому что параметры остаются переменными и ничем другим они стать не смогут, а вот если строить sql запрос склеиванием строк, то риск sql-инъекции так же велик как и в любой другой СУБД, и зыке программирования, поэтому во втором случае, нужно обязательно контролировать вставляемые параметры.
...
Рейтинг: 0 / 0
9 сообщений из 9, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / При записи во внешнюю базу слетает кодировка
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]