Задавайте вопросы, мы ответим
Вы не зашли.
Доброго времени суток!
В базе в одном столбце хранится число, в другом - текст. Использую функцию CONCAT для объединения этих столбцов:
concat(formLevel, ' ', letter), цифра получается, но вместо кириллической 'letter' получаю каракулю. Полагаю, что это связано с кодировкой. База вся в UTF-8, включая все текстовые поля. При работе с латиницей все нормально.
Подскажите как решить эту сложность. Заранее спасибо
Неактивен
Вы выполнили запрос SET NAMES UTF8 после подключения к базе? Может быть проблема с кодировкой соединения.
Неактивен
Что интересно. То что если выполняю этот запрос при подключении к базе, то в тех местах где раньше все было нормально, а именно при запросе из простых строковых полей без concat'a на выходе получается текст из каракуль такого же плана. В том месте где использовался concat все в прежнем виде
Кроме того, попробовал сделать запрос на добавление, предварительно выполнив конвертацию текста запроса из Ansi в utf8 (c++ builder), но при выполнении запроса выдает ошибку (#1064: check ... syntax near ''). Нужно ли копать в эту сторону или MySQL сам проводит преобразование в нужную кодировку?
Неактивен
Сразу после подключения к mysql отправьте запрос 'SET NAMES UTF8' и напишите, что получилось.
Неактивен
Сразу после подключения отправляю этот запрос:
Отредактированно NightStranger (18.02.2011 10:15:44)
Неактивен
Попробуем по частям, чтоб понять где зарыто... Запишите в файл результат какого-либо select-запроса ( можно без concat) чтобы выбиралось поле, содержащие русские символы и посмотрите - видны ли русские буквы в файле при кодировке utf-8.
Неактивен
И почему в билдере не использовать штатные способы доступа к данным?
Неактивен
Сделал вывод в файл. Русские символы не видны. Пробовал открыть в 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)
Неактивен
Под штатными средствами я подразумеваю объекты, которые есть в Builder, которые
позволяют обращаться к данным. Могу соврать, т.к. это было с десяток лет назад, но
что-то типа TADODatabase, TADOTable, ...
http://www.artlebedev.ru/tools/decoder/ неплохо определяет кодировки. Но Вы хотите
найти кодировку экспериментально, а не понять, почему оно происходит именно так
А какая кодировка у Вас в консоли, в которой Вы выполняете SET NAMES?
Неактивен
Да, можно работать через ADO и я полагаю, проблема решится, но для того, чтобы использовать соединение с MySQL нужно ставить драйвер ODBC, чего хочется избежать, сделав программу простой в установке.
Дело в том, что сроки несколько ограничены и в первую очередь хочется найти способ решения проблемы, и уже после разбираться в причинах для того, чтобы извлечь уроки на будущее.
Подскажите, пожалуйста, как определить кодировку консоли...
Неактивен
Кодировку консоли определить очень просто. Если у Вас виндоус со стандартными
российскими настройками, то консоль работает в cp866. Изменить кодировку кон-
соли можно командой chcp. SET NAMES нужно делать, соответственно, в кодировку
консоли.
Неактивен