Змінюй хід війни! Допомагай ЗСУ!

Unicode символы в SQL запросе (Delphi, Components, ODAC, UniDAC.. also..)

  • Автор теми Автор теми Vinya
  • Дата створення Дата створення
Статус: Офлайн
Реєстрація: 21.04.2005
Повідом.: 228
Unicode символы в SQL запросе (Delphi, Components, ODAC, UniDAC.. also..)

Каким образом можно передать текст запроса который использует Unicode символы ?

Компоненты ODAC и AnyDAC могут работать с Unicode строкой только через параметр, если же пишешь строку в само тело запроса то запрос не возвращает значений.

Кто небуть сталкивался с таким вопросом ?
В каком компоненте нормально отработает текст запроса с Unicode символами ?
 
Останнє редагування:
Это точно могут:
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.

⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.


думаю ODAC тоже может, но я его не юзал
 
В том то и дело что не точно могут, говорю же, БД в юникоде, вставить юникод строку в текст запроса можно только через параметр, иначе запрос не вернет не единой записи.
 
в принципе можно вот так:

function Win1251ToUnicode(const S: AnsiString): WideString;
var
Len: Integer;
begin
SetLength(Result, MultiByteToWideChar(1251, 0, PAnsiChar(S), Length(S), nil,
0));
MultiByteToWideChar(1251, 0, PAnsiChar(S), Length(S), PWideChar(Result),
Length(Result));
end;
 
Скорее всего у тебя разный байтовый порядок в базе и строке.
 
база и настройка OraSession Al32UTF8; UseUnicode True, Delphi2010 понимает юникод строки, преобразования не нужны, помещая запрос с условием типа "WHERE A='<юникод символ>' "запрос не возвращает строки, хотя из PL/SQL результат есть.

Если же сделать так - "WHERE A=:par ", потом заполнить par='<юникод символ>', то запрос отработает нормально и из клиента Delphi.
Но хотелось бы чтоб все же запрос можно было писать сразу с юникод строкой, а не через параметр.
 
база и настройка OraSession Al32UTF8; UseUnicode True, Delphi2010 понимает юникод строки, преобразования не нужны, помещая запрос с условием типа "WHERE A='<юникод символ>' "запрос не возвращает строки, хотя из PL/SQL результат есть.

Если же сделать так - "WHERE A=:par ", потом заполнить par='<юникод символ>', то запрос отработает нормально и из клиента Delphi.
Но хотелось бы чтоб все же запрос можно было писать сразу с юникод строкой, а не через параметр.

вот специально сейчас попробовал. Использовал MyDAC. Работает.
Я не думаю, что ODAC будет вести себя сильно по другому.
 
Я в оракле не силен, но мне кажется, что Al32UTF8 это не уникод, а utf8
 
Уверены ?
Попробуйте вставьте в БД эти символы "Җ Қ Ң", а потом по условию WHERE выберите их с клиента, отработает ?
 
А если запрос написать в файл а потом сделать так:
Query.SQL.LoadFromFile(filename);
Query.Execute;

Сработает?
 
не факт, файл надо сохранить с пометкой что он UTF8, а это + к началу файла вставка пометки, и как потом прочтет он содержимое это тоже не однозначно. Да и постоянно делать сэйв - лоад тоже не вариант для быстродействия..
 
Как
⚠ Тільки зареєстровані користувачі бачать весь контент та не бачать рекламу.
Кайт:
I still wish....
  • when others would be removed from plsql
  • triggers would be deprecated and removed
  • autonomous transactions would start just raising errors
  • literals in sql would raise an error
 
напоминает надпись "вени види вичи", и что бы это значило ?
 
напоминает надпись "вени види вичи", и что бы это значило ?

Зачем использовать литерал, а не bind variable? Зачастую использование литералов считается признаком криворукости программиста.
 
даа.. ну тогда объясните эту криворукость из девэкспреса, которые создали фильтр грида с явным указанием строки запроса без параметров.
 
даа.. ну тогда объясните эту криворукость из девэкспреса, которые создали фильтр грида с явным указанием строки запроса без параметров.

Не надо смотреть на кучу багов под вывеской DevExpress. Да и не для Oracle оно сделано.
 
ну вот знач ручками и придется допиливать :(
 
Перекрыть формирование запроса своим кодом не?
 
ну вот и делаю...
перевод на параметризированный запрос, добавление параметров потом в него....
еще варик появился в текст запроса передавать кода символов, и в запросе через UniStr добавлять эти символы :)
 
Эх компоненты ... разбаловались совсем )
хотя я тоже на MyDac работал одно время, теперь чистый C++ API + libmysqlclient_r.so и все работает в юникодах тоже )
 
Назад
Зверху Знизу