powered by simpleCommunicator - 2.0.41     © 2025 Programmizd 02
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ODBC и Русский язык
11 сообщений из 11, страница 1 из 1
ODBC и Русский язык
    #37996972
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Из PHP через ODBC я выполняю запрос, но запрос содержит русское слово, и запрос не выполняется. Возникают 2 вопроса:
1) Как решить эту проблему
2) Почему он не работает (правда у меня есть мнение, но хотелось бы правильного ответа)

Да пример запроса
select * from mydictianary where rusname = 'запрос'
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37997032
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov Timur ,

8-бит или Unicode?
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37997060
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

Unicode
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37997240
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov Timur ,

1) проверьте, включено ли в настройках ODBC Unicode SQLTypes
2) проверьте, в той ли кодировке передаёте значение параметра

Сделал небольшой тест ($zv=Cache for Windows (x86-64) 2012.2 (Build 638U)):

1) в области "SAMPLES" в таблицу Sample.Company добавил новую строку

MissionNameМиссия выполнена!Caché+запрос+bună ziua
2) написал программу на VBScript
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
adVarWChar=202
adParamInput=1
adCmdText=1

strParam="Cach" & ChrW(233) & "+запрос+bun" & ChrW(259) & " ziua"

Set cn=Createobject("ADODB.Connection")

cn.ConnectionString="DRIVER={InterSystems ODBC35}; SERVER=127.0.0.1; PORT=1972; DATABASE=SAMPLES; UID=_system; PWD=SYS; Unicode SQLTypes=1;"
'или так
'cn.ConnectionString="DSN=CACHE Samples;UID=_system; PWD=SYS;"

cn.open

Set cmd=Createobject("ADODB.Command") 

with cmd
  .ActiveConnection = cn
  .CommandType = adCmdText
  .CommandText = "select Mission from Sample.Company where Name=?"

  .Parameters.Append .CreateParameter("p1", adVarWChar, adParamInput, 50, strParam)
end with


Set rs = cmd.Execute

'А можно и без параметра, но лучше так не делать
'Set rs = cn.execute("select Mission from Sample.Company where Name='"&strParam&"'")

if not rs.EOF then
  WScript.Echo rs.Fields("Mission")
End if

cn.Close


Запуск программы:
Код: plaintext
wscript.exe test.vbs

Результат:
Код: plaintext
Миссия выполнена!
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37997611
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Несколько лет назад пришлось помогать коллегам с подобной проблемой. Заметки остались, привожу выжимку. В наших условиях php был под Linux'ом. Заранее предупреждаю - я не php-шник, да и подробностей за давностью уже не помню, так что вопросов постарайтесь не задавать :)

Установка локали CP1251

Надо сказать, что результирующий набор, возвращаемый Cache ODBC, всегда в кодировке CP1251 (вне зависимости от 8-битности экземпляра Cache). По крайней мере, я не знаю как это изменить (да и надо ли?). Поэтому надо установить в Linux соответствующую локаль. Например, в Ubuntu 9.10 это делается так:

sudo locale-gen ru_RU.CP1251

locale -a | grep 1251

в списке локалей появятся:

ru_RU.cp1251

В RedHat-подобных дистрибутивах (проверено в FC 8, CentOS 5.x) локаль устанавливается так:

sudo localedef --no-archive -c -f CP1251 -i ru_RU ru_RU.CP1251

Проверка наличия ru_RU.cp1251 выполняется аналогично:

locale -a | grep 1251
...

Тестирование в php
...
Если вы захотите попробовать что-нибудь русское (ну и собственно приступить к разработке :), не забывайте вставить поближе к началу кода (php) установку текущей локали CP1251:

echo setlocale(LC_ALL, 'ru_RU.CP1251', 'rus_RUS.CP1251', 'Russian_Russia.1251');
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37997671
Adylov Timur
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
servit,

да работает, все хорошо, только мне нужно через PHP
пример взял отсюда

Подставляю русское слово в запрос не работает.
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37998253
Adylov Timur,

а в PHP нельзя это слово в досовскую кодировку перевести?

В Delphi например делала так:
s:=DosToWin('запрос'); //слово переводмится из Win в Dos


и:
function DosToWin(St: string): string;
var
Ch: PChar;
begin
Ch := StrAlloc(Length(St) + 1);
OemToAnsi(PChar(St), Ch);
Result := Ch;
StrDispose(Ch)
end;

И наоборот :
function WinToDos(St: string): string;
var
Ch: PChar;
begin
Ch := StrAlloc(Length(St) + 1);
AnsiToOem(PChar(St), Ch);
Result := Ch;
StrDispose(Ch)
end;
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #37998288
Alexey Maslov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov Timur,

вы правы, второе место, где надо указать правильную кодировку - заголовок страницы:

<META content="text/html; charset=windows-1251" http-equiv="Content-Type">

о первом месте написал выше. Спасибо, что напомнили!
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #38000215
servit
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov Timurservit,

да работает, все хорошо, только мне нужно через PHPДанные те же:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<?php

$strParam="Cach&#233;+запрос+bun&#259; ziua";

$cn=new COM("ADODB.Connection", NULL, CP_UTF8);
$cn->open("DRIVER={InterSystems ODBC35}; SERVER=127.0.0.1; PORT=1972; DATABASE=SAMPLES; UID=_system; PWD=SYS;");

$rs=$cn->execute("SELECT Mission FROM Sample.Company WHERE Name='$strParam'");
while (!$rs->EOF) { 
  echo mb_convert_encoding($rs->Fields(0)->value,"CP866"), PHP_EOL;
  $rs->MoveNext(); 
} 
$rs->Close();
$cn->Close();
?>


Запуск программы:
Код: plaintext
php.exe test.php

Результат:
Код: plaintext
Миссия выполнена!

Если у Вас только русские символы в БД, то проблем быть не должно и с интерфейсами odbc_xxx , PDO .
Иначе придётся вручную кодировать строки, так как UTF-8 в них не используется, даже несмотря на наличие "Unicode SQLTypes=1".

Перекодировку строк можно себе немного облегчить, написав на сервере хранимую процедуру:/// This sample persistent class represents a company.<br>
Class Sample.Company Extends (%Persistent, %Populate, %XML.Adaptor)
{
...
ClassMethod PHP2UTF8(str As %String(MAXLEN=32000)) As %String(MAXLEN=64000) [ SqlProc ]
{
  q $zcvt($zcvt(str,"O","CP1251"),"I","UTF8")
}

}Тогда код с использованием стандартных средств PHP примет вид:
Код: php
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?php

$strParam="Cach&#233;+запрос+bun&#259; ziua";

if ($cn=odbc_connect("DRIVER={InterSystems ODBC35}; SERVER=127.0.0.1; PORT=1972; DATABASE=SAMPLES; UID=_system; PWD=SYS;","","")){

  if($rs=odbc_do($cn, "SELECT Mission FROM Sample.Company where Name=Sample.Company_PHP2UTF8('$strParam')")) {

    $row = odbc_fetch_array($rs);
    echo mb_convert_encoding($row["Mission"],"CP866","CP1251"), PHP_EOL;

    odbc_free_result($rs);
  }

  odbc_close($cn);
}
?>


Результат будет тот же, что и выше.

PS: полноценную работу с UTF-8 обеща(ют/ли) в PHP 6.

PPS:
Код: php
1.
$strParam="Cach&#233;+запрос+bun&#259; ziua";

следует читать как$strParam="Caché+запрос+bună ziua";
...
Рейтинг: 0 / 0
Период между сообщениями больше года.
ODBC и Русский язык
    #39805842
VenumGodzilla
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Adylov Timur, скажи пожалуйста если не трудно, как с нуля подключиться к Cache ODBC
...
Рейтинг: 0 / 0
ODBC и Русский язык
    #39809366
kalin
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Adylov TimurИз PHP через ODBC я выполняю запрос, но запрос содержит русское слово, и запрос не выполняется. Возникают 2 вопроса:
1) Как решить эту проблему
2) Почему он не работает (правда у меня есть мнение, но хотелось бы правильного ответа)

Да пример запроса
select * from mydictianary where rusname = 'запрос'
Данную проблему для себя решал нетривиально.
СУБД Cache кодировке Windows 1251, внешнее приложение на питон в utf8, данные получает из через sql запрос.
Проблема заключалась еще в том, что параметры запроса попадали в базу в правильной кодировке, а возвращались данные в питон в неправильной и соответственно ничего не выбиралось. При попытке получить данные через объект, поля приходили в виде вопросиков. Все решилось созданием доп. полей, где данные полей формировались в виде UTF8 строк.
...
Рейтинг: 0 / 0
11 сообщений из 11, страница 1 из 1
Форумы / Caché, Ensemble, DeepSee, MiniM, IRIS, GT.M [игнор отключен] [закрыт для гостей] / ODBC и Русский язык
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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