SQLinfo.ru - Все о MySQL

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 17.02.2011 22:06:15

NightStranger
Участник
Зарегистрирован: 17.02.2011
Сообщений: 5

Сложность с CONCAT

Доброго времени суток!

В базе в одном столбце хранится число, в другом - текст. Использую функцию CONCAT для объединения этих столбцов:
concat(formLevel, ' ', letter), цифра получается, но вместо кириллической 'letter' получаю каракулю. Полагаю, что это связано с кодировкой. База вся в UTF-8, включая все текстовые поля. При работе с латиницей все нормально.

Подскажите как решить эту сложность. Заранее спасибо

Неактивен

 

#2 17.02.2011 22:18:03

rgbeast
Администратор
MySQL Authorized Developer and DBA
Откуда: Москва
Зарегистрирован: 21.01.2007
Сообщений: 3880

Re: Сложность с CONCAT

Вы выполнили запрос SET NAMES UTF8 после подключения к базе? Может быть проблема с кодировкой соединения.

Неактивен

 

#3 18.02.2011 05:56:36

NightStranger
Участник
Зарегистрирован: 17.02.2011
Сообщений: 5

Re: Сложность с CONCAT

Что интересно. То что если выполняю этот запрос при подключении к базе, то в тех местах где раньше все было нормально, а именно при запросе из простых строковых полей без concat'a на выходе получается текст из каракуль такого же плана. В том месте где использовался concat все в прежнем виде

Кроме того, попробовал сделать запрос на добавление, предварительно выполнив конвертацию текста запроса из Ansi в utf8 (c++ builder), но  при выполнении запроса выдает ошибку (#1064: check ... syntax near ''). Нужно ли копать в эту сторону или MySQL сам проводит преобразование в нужную кодировку?

Неактивен

 

#4 18.02.2011 07:54:20

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сложность с CONCAT

Сразу после подключения к mysql отправьте запрос 'SET NAMES UTF8' и напишите, что получилось.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#5 18.02.2011 10:15:17

NightStranger
Участник
Зарегистрирован: 17.02.2011
Сообщений: 5

Re: Сложность с CONCAT

Сразу после подключения отправляю этот запрос:


MYSQL *Con;
...
Con=mysql_init(Con);
Con=mysql_real_connect(Con,cfgDBHost.c_str(),cfgDBLogin.c_str(),cfgDBPass.c_str(),cfgDBName.c_str(),0,NULL,0);
if(!Con) ShowMessage("Can not connect.");
mysql_query(Con,"SET NAMES UTF8");


Ошибки нет. Результата не возвращает. Программа запускается штатно. Вместо ВСЕХ кириллических букв в результате запроса - кракозябры: Ó÷èòåëü . В том месте где concat - все то же самое.

Может проблема где-то в Cpp из-за использования типа AnsiString? Хотя Добавление функции Utf8ToAnsi не изменило ситуацию, точнее изменило кракозябры на вопросительные знаки...

Отредактированно NightStranger (18.02.2011 10:15:44)

Неактивен

 

#6 18.02.2011 13:34:18

deadka
Администратор
Зарегистрирован: 14.11.2007
Сообщений: 2422

Re: Сложность с CONCAT

Попробуем по частям, чтоб понять где зарыто... Запишите в файл результат какого-либо select-запроса ( можно без concat) чтобы выбиралось поле, содержащие русские символы и посмотрите - видны ли русские буквы в файле при кодировке utf-8.


Зеленый свет для слабаков, долги отдают только трусы, тру гики работают только в консоли...

Неактивен

 

#7 21.02.2011 12:26:22

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Сложность с CONCAT

И почему в билдере не использовать штатные способы доступа к данным? smile

Неактивен

 

#8 22.02.2011 09:17:27

NightStranger
Участник
Зарегистрирован: 17.02.2011
Сообщений: 5

Re: Сложность с CONCAT

Сделал вывод в файл. Русские символы не видны. Пробовал открыть в word'e и перебрать кодировки. Не видны ни в одной из них. Пробовал предварительно сделать SET NAMES UTF8 - не помогло.
Честно говоря, не понимаю, каким образом builder видит там кириллицу.

paulus, что вы подразумеваете под "штатными способами"?

---

Что интересно. Если в word'e выбираю кодировку DOS, то получаю текст "├П├е├▓├░├о├в    ├И├в├а├н    ├С├и├д├о├░├о├в├и├╖ " вместо "Петров Иван Сидорович" (это три поля, без concat'a)

PS: запросы выполняю через MySQL Query Browser, если это вдруг имеет значение

---

И еще один момент:
Наткнулся в сети на запрос

Код:

show variables like "char%";

выполнение для моей базы дало результат:

Query show variables like "char%", Tue Feb 22 12:28:18 2011
Variable_name    Value
character_set_client    utf8
character_set_connection    utf8
character_set_database    latin1
character_set_filesystem    binary
character_set_results    utf8
character_set_server    latin1
character_set_system    utf8
character_sets_dir    C:\Program Files (x86)\MySQL\MySQL Server 5.0\share\charsets\

но запрос "SET character_set_database = 'UTF8';" ничего не изменил, но и ошибки не выдал (я под root'ом)

---

Попробовал выполнять запросы через консоль:
set names utf8;
// При Select'e выдал кириллические символы как вышеописанные из word'a
// Попробовал обновить запись:

mysql> update users set surname='Иванов' where userid=10;
ERROR 1406 (22001): Data too long for column 'surname' at row 1

После выполнения
set character_set_database = utf8;
set character_set_server = utf8;
тоже ничего не изменилось

PSPS: сори за длинное сообщение, пытаюсь дать исчерпывающую информацию, чтобы понять где косяк

Отредактированно NightStranger (22.02.2011 09:50:31)

Неактивен

 

#9 22.02.2011 15:38:26

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Сложность с CONCAT

Под штатными средствами я подразумеваю объекты, которые есть в Builder, которые
позволяют обращаться к данным. Могу соврать, т.к. это было с десяток лет назад, но
что-то типа TADODatabase, TADOTable, ...

http://www.artlebedev.ru/tools/decoder/ неплохо определяет кодировки. Но Вы хотите
найти кодировку экспериментально, а не понять, почему оно происходит именно так sad

А какая кодировка у Вас в консоли, в которой Вы выполняете SET NAMES?

Неактивен

 

#10 22.02.2011 17:46:45

NightStranger
Участник
Зарегистрирован: 17.02.2011
Сообщений: 5

Re: Сложность с CONCAT

Да, можно работать через ADO и я полагаю, проблема решится, но для того, чтобы использовать соединение с MySQL нужно ставить драйвер ODBC, чего хочется избежать, сделав программу простой в установке.

Дело в том, что сроки несколько ограничены и в первую очередь хочется найти способ решения проблемы, и уже после разбираться в причинах для того, чтобы извлечь уроки на будущее.

Подскажите, пожалуйста, как определить кодировку консоли...

Неактивен

 

#11 23.02.2011 01:08:16

paulus
Администратор
MySQL Authorized Developer and DBA
Зарегистрирован: 22.01.2007
Сообщений: 6757

Re: Сложность с CONCAT

Кодировку консоли определить очень просто. Если у Вас виндоус со стандартными
российскими настройками, то консоль работает в cp866. Изменить кодировку кон-
соли можно командой chcp. SET NAMES нужно делать, соответственно, в кодировку
консоли.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson