Форум программистов «Весельчак У»
  *
Добро пожаловать, Гость. Пожалуйста, войдите или зарегистрируйтесь.
Вам не пришло письмо с кодом активации?

  • Рекомендуем проверить настройки временной зоны в вашем профиле (страница "Внешний вид форума", пункт "Часовой пояс:").
  • У нас больше нет рассылок. Если вам приходят письма от наших бывших рассылок mail.ru и subscribe.ru, то знайте, что это не мы рассылаем.
   Начало  
Наши сайты
Помощь Поиск Календарь Почта Войти Регистрация  
 
Страниц: [1]   Вниз
  Печать  
Автор Тема: Кодировка в mysql  (Прочитано 31530 раз)
0 Пользователей и 1 Гость смотрят эту тему.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« : 05-02-2007 06:33 » 

Так сказать моё освоение perl+sql прродолжается.
вот возникла проблема с выводом русских символов.

сождел в mysql таблицу, там написал по-русски. при попытке вывести эту строку поплучаю строку из символов "?".

как с этим бороться?
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #1 : 05-02-2007 06:49 » 

CAHTA_, подумай о кодировках. Perl тут не при чем.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #2 : 05-02-2007 07:01 » 

в шеле тоже выводится ахинея с "?"
в браузре испробовал все доступные кодировки...
Записан
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #3 : 05-02-2007 09:19 » 

что делать то? в шеле локаль на koi8-r. но смено ахинея выводится в шеле... ввиде "?"
Записан
Serg79
Команда клуба

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #4 : 05-02-2007 10:34 » new

Не помню точно, но помоему MySQL все текстовые данные по умолчанию хранит в кодеровке UTF-8.
Если это так то тебе надо либо переназначить кодеровку для хранения тексовых данных, либо ручками делать перекодеровку.
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #5 : 05-02-2007 10:40 » 

Во-первых, стоит выяснить, кодировку исходного материала, занесенного в базу и какие манипуляции выполнила программа, занесшая сие.
Во-вторых, посмотреть версию базы - линейка 5.х поддерживает управление кодировками на уровне баз, таблиц и столбцов.
Ну и наконец, дефолтная настройка для клиента (см. в конфиге).
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #6 : 05-02-2007 14:16 » 

версия mysql 4.1.22

вот сама таблица.
Код:
CREATE TABLE fg_t
(
   foto_id INT UNSIGNED NOT NULL AUTO_INCREMENT,
   PRIMARY KEY (foto_id),
   f_name VARCHAR(100) NOT NULL,
   f_w_h VARCHAR(11) NULL,
   f_s VARCHAR(6) NULL,
   fgroup VARCHAR(50) NULL,
   mcomm VARCHAR(150) NULL,
   ucomm VARCHAR(20) NULL
);

вот перл код. с помошью которого я бытаюсь получить строку, расположенную в mcomm
Код:
#! /usr/bin/perl -w
print "content-type: text/html \n\n";

use strict;
use DBI;
use lib qw(/usr/local/apache/lib/perl);
use CGI qw(:standard);

my ($dbh, $sth);
$dbh = DBI->connect (
                      "DBI:mysql:host=***;database=***",
                      "***",
      "***",
      {PrintError=>0, RaiseError=>1}
    );
$sth = $dbh -> prepare("SELECT mcomm FROM fg_t WHERE foto_id = 19");
$sth -> execute();

my @val = $sth->fetchrow_array();

print $val[0];

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

должно выдавать строку "Чечня, Грозный, гостиница "Советская". Ожесточенный бой", а выдает строку
"Не понял??, Не понялНе понял?, Не понялНе понялНе понял "Не понялНе понялНе понял". Не понялНе понялНе понялНе понял Не понял"  =(

пытаясь исправить положение, войдя в  mysql,ввел команду set CHARACTER SET cp1251. но не помогло =(

P.S. смайл Не понял = 3х "?"
« Последнее редактирование: 05-02-2007 14:20 от CAHTA_ » Записан
CAHTA_
Постоялец

ru
Offline Offline
Пол: Мужской

« Ответ #7 : 05-02-2007 14:19 » 

и еше...

Код:
mysql> INSERT INTO fg_t VALUES('','I_oo11.jpg','600*917','291','b_fotik','','');
Query OK, 1 row affected, 1 warning (0.00 sec)

почему предупреждение то?
« Последнее редактирование: 15-12-2007 21:55 от Алексей1153++ » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #8 : 05-02-2007 14:43 » 

Выполни скрипт в консоле.

Про источник данных ты ничего не написал!
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #9 : 12-09-2008 11:42 » 

Ситуация аналогичная. При создании базы данных указывал опцию:  CHARACTER SET cp1251. Создал файл с данными для одной из таблиц базы в кодировке cp1251. Добавляю его в таблицу с помощью LOAD DATA INFILE.... В терминале смотрю таблицу:
Код:
SELECT * FROM makers;
- получаю имена мейкеров в виде
Код:
????.?.
Думаю, может терминал не понимает. Посмотрел в Настройка->Кодировка стоит cp1251. Очистил таблицу, затем установил кодировку для конкретной таблицы:
Код:
ALTER TABLE makers CONVERT TO CHARACTER SET cp1251 COLLATE cp1251_general_ci;
Опять добавил записи в таблицу - ничего не изменилось. Опять одни знаки вопроса,  вместо букв! Как же все-таки сделать правильно?
Записан
andrystepa
Помогающий

ru
Offline Offline

« Ответ #10 : 12-09-2008 12:07 » 

Прошу прощения, нашел в чем дело! Просто в клиенте надо было указать кодировку:
Код:
mysql>SET NAMES 'cp1251'
и всего-то!!
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #11 : 12-09-2008 14:21 » 

andrystepa, для начала: какая версия mysql-сервера?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #12 : 25-09-2008 07:24 » 

RXL,
andrystepa, для начала: какая версия mysql-сервера?

Версия сервера mysql-server-5.0.45-6.fc8.i386. Команда
Код:
mysql>SET NAMES 'cp1251'
к сожалению помогает только до перезагрузки. Команды
Код:
SET GLOBAL character_set_client='cp1251';

SET GLOBAL character_set_results='cp1251';

SET GLOBAL character_set_connection='cp1251';
вообще не помогают. К тому же эта команда выправляет отображение символов только в консоли. В любом веб-браузере все равно выдаются одни знаки вопроса! По команде SHOW VARIABLES про кодировки пишется такое:
Код:
character_set_client            | cp1251                                                  |
| character_set_connection        | cp1251                                                  |
| character_set_database          | cp1251                                                  |
| character_set_filesystem        | binary                                                  |
| character_set_results           | cp1251                                                  |
| character_set_server            | latin1                                                  |
| character_set_system            | utf8                                                    |
Это после команды SET NAMES ...
« Последнее редактирование: 25-09-2008 07:26 от andrystepa » Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #13 : 25-09-2008 18:21 » 

andrystepa, SET NAMES не до перезагрузки работает - это влияет только на одну сессию (в которой выполняется) и только на время сессии.

А с кодировками у тебя ужас какой-то...

Давай будем примерами оперировать. Вот такая настройка (в конфиге, блок mysqld)

Код:
character-set-client-handshake
character-set-filesystem = utf8
character-set-server = utf8
default-character-set = utf8

дает

Код:
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | latin1                     |
| character_set_connection | latin1                     |
| character_set_database   | utf8                       |
| character_set_filesystem | utf8                       |
| character_set_results    | latin1                     |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

При подключении я указываю либо --default-character-set=utf8 (когда работаю консольным mysql-клиентом или бекаплю утилитой mysqldump), либо выполняю SET NAMES utf8 (в случае других программ). Это дает такой эффект:

Код:
mysql> show variables like 'character_set%';
+--------------------------+----------------------------+
| Variable_name            | Value                      |
+--------------------------+----------------------------+
| character_set_client     | utf8                       |
| character_set_connection | utf8                       |
| character_set_database   | utf8                       |
| character_set_filesystem | utf8                       |
| character_set_results    | utf8                       |
| character_set_server     | utf8                       |
| character_set_system     | utf8                       |
| character_sets_dir       | /usr/share/mysql/charsets/ |
+--------------------------+----------------------------+

Где character_set_database зависит от DEFAULT CHARACTER SET при создании или модификации базы.
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
andrystepa
Помогающий

ru
Offline Offline

« Ответ #14 : 26-09-2008 12:06 » 

RXL,  С кодировками действительно ужас. А все потому, что мне надо чтобы данные в базе хранились на русском языке, причем изменяться и обновляться они будут через веб интерфейс (написанный на php) из Виндовых веб браузеров (чаще всего это Internet Explorer). Я предположил  что в этом случае удобнее использовать кодировку win1251, поэтому базу данных создал с DEFAULT CHARACTER SET win1251. А в my.cfg, в секции [mysqld], впрочем, как и в других секциях, никаких упоминаний о кодировке нет - то есть все по дефаулту. Поэтому я никак не могу определить, что же туда следует написать в моем случае (локаль у меня utf8). Данные в базу записывал в кодировке win1251. И веб-интерфейс пишу в этой же кодировке.
Записан
Paymer-Soft
Новенький

ua
Offline Offline

« Ответ #15 : 08-12-2013 03:06 » 

После старта сессии MySQL нужно выполнять команду SET NAMES 'cp1251';
Записан
RXL
Технический
Администратор

ru
Offline Offline
Пол: Мужской

WWW
« Ответ #16 : 08-12-2013 07:28 » 

После старта сессии MySQL нужно выполнять команду SET NAMES 'cp1251';

Зачем откапывать тему и дублировать информацию?
Записан

... мы преодолеваем эту трудность без синтеза распределенных прототипов. (с) Жуков М.С.
Страниц: [1]   Вверх
  Печать  
 

Powered by SMF 1.1.21 | SMF © 2015, Simple Machines