Автор Тема: MySQL + CGI perl проблема с русским  (Прочитано 6306 раз)

0 Пользователей и 1 Гость просматривают эту тему.

Оффлайн Nikolai Z.

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« : 15 Февраля 2006, 10:08:03 »
Доброго времени суток....

Вот проблемка возникла, поставил я на Win2k, Perl + MySQL 5.
До этого я MySQL никогда сам не ставил... использовал хостинговые.

И наткнулся на проблему... Когда я добавляю запись в таблицу.... русские символы превращаются в ???? знаки вопросов.

Пробовал менять кодировку как самого сервака, так и БД, так и таблцы, и даже отдельного поля....

Вот подумал а может дело не в MySQL а в перле или еще в чем?

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #1 : 15 Февраля 2006, 11:40:38 »
по умолчанию установлена страница latin1 и текст хранится в кодировке utf8 отсюда и ваши проблемы.
страницу можно исправить в файле конфигурации бд - my.ini
в скрипте можно делать так:
if ($dbh) {
     $dbh->do("use $db_name") or die $DBI::errstr;
     $dbh->do(\'SET CHARACTER SET cp1251\') or die $DBI::errstr;
     $dbh->do(\'SET NAMES cp1251\') or die $DBI::errstr;
}
пока-пока. :)

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #2 : 15 Февраля 2006, 11:45:18 »
а. и еще, если вы поставили себе 4-ю версию бд, - таблицы можно открывать так:CREATE TABLE `example` (
  `id` INT(11) UNSIGNED NOT NULL AUTO_INCREMENT,
......,
  PRIMARY KEY(`id`)
)
ENGINE = MYISAM
CHARACTER SET cp1251 COLLATE cp1251_general_ci;

;)
пока-пока. :)

Оффлайн Nikolai Z.

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #3 : 15 Февраля 2006, 17:17:14 »
AnnA
непомогло =(
Может в скрипте что не так?

Чуток попозже я кину как БД выглядит и скрипт

Оффлайн Nikolai Z.

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #4 : 15 Февраля 2006, 17:36:36 »
SQL:
CREATE TABLE `users` (
`name` VARCHAR( 100 ) ,
PRIMARY KEY ( `name` )
) ENGINE = MYISAM CHARACTER SET cp1251 COLLATE cp1251_general_ci;


INSERT INTO `users` ( `name` ) VALUES (\'Вася Пупкин\');
INSERT INTO `users` ( `name` ) VALUES (\'Vasia Pupkin\');

PERL:

#!/usr/bin/perl -w

use strict;
use 
DBI
use 
CGI;

my $CGI = new CGI;

my $dbh DBI->connect("DBI:mysql:test:localhost","test","test", {RaiseError => 1PrintError => 0}); 

my $sth $dbh->prepare("SELECT name FROM users");
   
$sth->execute();
 
print 
$CGI->header(); 
   
while(
my $text $sth->fetchrow_array()) { 
 print 
$text."
"
;
}

$sth->finish();
$dbh->disconnect();


Результат:
Vasia Pupkin
???? ??????


Результт на хостинге:
Vasia Pupkin
Вася Пупкин
« Последнее редактирование: 15 Февраля 2006, 17:48:35 от Nikolai Z. »

Оффлайн AnnA

  • Фанатка форума
  • Старожил
  • ****
  • Сообщений: 263
  • +0/-0
  • 2
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #5 : 15 Февраля 2006, 18:51:07 »
а локально (не на хостинге), помимо:
print $CGI->header(-charset=>\'windows-1251\');
еще и то, что я уже писала
Цитировать
AnnA:
if ($dbh) { $dbh->do("use $db_name") or die $DBI::errstr; $dbh->do(\'SET CHARACTER SET cp1251\') or die $DBI::errstr; $dbh->do(\'SET NAMES cp1251\') or die $DBI::errstr; }
пока-пока. :)

Оффлайн Nikolai Z.

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 14
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #6 : 15 Февраля 2006, 19:01:16 »
AnnA
Супер!!! СпасибО большое!

#!/usr/bin/perl -w 

use strict
use 
DBI
use 
CGI

my $CGI = new CGI

my $dbh DBI->connect("DBI:mysql:test:localhost","test","test", {RaiseError => 1PrintError => 0}); 
  
$dbh->do(\'SET CHARACTER SET cp1251\');

my $sth = $dbh->prepare("SELECT name FROM users"); 
   $sth->execute(); 

print $CGI->header(-charset=>\'windows-1251\'); 
    
while(my $text = $sth->fetchrow_array()) { 
print $text."
"; 


$sth->finish(); 
$dbh->disconnect();


Вот так работает!
Правда я не допру немного, почему на ххостингах эта строка вообще нефиг не нужна... а на локальном приходится вот такой лишний запрос в БД делать?

Ну ладно... перед тем как в нет выкладывать мона эту строку будет закомментировать.

А что лучше использовать?
$dbh->do(\'SET CHARACTER SET cp1251\');
или
$dbh->do(\'SET NAMES cp1251\');

вдвоем их можно и не указывать... с 1 все работает....

Оффлайн Angel

  • Заглянувший
  • Новичок
  • *
  • Сообщений: 13
  • +0/-0
  • 0
    • Просмотр профиля
    • http://
MySQL + CGI perl проблема с русским
« Ответ #7 : 18 Марта 2006, 19:14:28 »
Продолжаю тему:

Некоторые юзеры оставляют в базе вместо нормального текста кириллицей - кракозяблики. Методом научного тыка подобрал кодировку, при которой их кракозяблики становились читабельными - UTF-8. Вся страничка и все данные - в CP-1251.

Как решить данную проблему?

Оффлайн ondr

  • Модератор
  • Глобальный модератор
  • Старожил
  • *****
  • Сообщений: 440
  • +0/-0
  • 0
    • Просмотр профиля
MySQL + CGI perl проблема с русским
« Ответ #8 : 18 Марта 2006, 22:16:02 »
Angel
обоснуй проблему
0 OK, 0:1

 

Sitemap 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