![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как указать в INSERT'е, что строки в запросе представлены в UTF-8 [MySQL]
Aldor_ © (2007-01-03 08:06:00)? Сервер MySQL. Проблема следующая: пытаюсь выполнить запрос вида
INSERT INTO `TableName` VALUES ( {...}, '& #1074;& #1080;& #1076;& #1080;& #1084; {...}');
(пробелов между '&' и '#' на самом деле нет, я из специально поставил чтобы браузер не интерпретировал &-последовательность)
При длине unicode-текста, превышающей некоторое значение сервером выдаётся ошибка: "Data too long for column `xxx`". Поле 'xxx' имеет тип text.
Точный порог не измерял, но предполагаю что это 1/6 от максимальной длины поля text (потому что один символ заменяется на шесть символов).
Текст, передаваемый в поле 'xxx' заведомо в размер типа text укладывается, так как это бэкап с другой базы.
Aldor_ (2007-01-03 13:23:00) [1]
> DrPass © (03.01.07 12:51) [6]
Спасибо, неожиданный для меня ответ :)
Буду пытаться сделать dump базы таким образом, чтобы строки не отображались в виде &-последовательностей.
DrPass (2007-01-03 12:51:00) [2]Нет, конечно. В крайнем случае можно попробовать написать хранимую процедуру, в которой будет выполняться преобразование данных, и вставлять данные через нее (правда, я не знаю возможностей MySQL в этой части). С триггером на вставку не получится, т.к. длина строки будет проверяться еще до срабатывания триггера.
Aldor_ (2007-01-03 12:17:00) [3]
> Вполне логично, что преобразование данных - это не задача
> SQL-сервера, а задача программы, которая выполняет вставку
> данных. Если речь идет о Delphi-приложении, то нужно преобразовать
> последовательность в WideString, и добавить ее в оператор
> INSERT через параметр
В том и вопрос, а может ли SQL-интерпретатор сервера выполнить эту работу
DrPass (2007-01-03 11:07:00) [4]
> проблема как раз в том, чтобы SQL-сервер "понял", что это
> коды юникод-символов
Вполне логично, что преобразование данных - это не задача SQL-сервера, а задача программы, которая выполняет вставку данных. Если речь идет о Delphi-приложении, то нужно преобразовать последовательность в WideString, и добавить ее в оператор INSERT через параметр
Aldor_ (2007-01-03 10:33:00) [5]
> DrPass © (03.01.07 10:22) [2]
> Логично. Увеличь его в шесть раз, и все получится.
Нужно чтобы структура таблиц и параметры атрибутов были неизменны (чтобы была копия базы)
> & #1074;& #1080;& #1076;& #1080;& #1084; - это не юникод.
> Это обычная ANSI-строка, в которой записаны юникодные коды
> символов.
Да, Вы правы, и проблема как раз в том, чтобы SQL-сервер "понял", что это коды юникод-символов, записанные в ANSI, а не произвольная ANSI-строка.
DrPass (2007-01-03 10:22:00) [6]
> Точный порог не измерял, но предполагаю что это 1/6 от максимальной
> длины поля text
Логично. Увеличь его в шесть раз, и все получится.
> как указать серверу, что строки, передаваемые в запросе
> представлены в Юникоде
& #1074;& #1080;& #1076;& #1080;& #1084; - это не юникод. Это обычная ANSI-строка, в которой записаны юникодные коды символов.
Aldor_ (2007-01-03 08:10:00) [7]Таким образом, задача: как указать серверу, что строки, передаваемые в запросе представлены в Юникоде?