Текущий архив: 2007.03.25;
Скачать: CL | DM;
Вниз
Как указать в INSERT е, что строки в запросе представлены в UTF-8 Найти похожие ветки
← →
Aldor_ (2007-01-03 08:06) [0]? Сервер 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 08:10) [1]Таким образом, задача: как указать серверу, что строки, передаваемые в запросе представлены в Юникоде?
← →
DrPass © (2007-01-03 10:22) [2]
> Точный порог не измерял, но предполагаю что это 1/6 от максимальной
> длины поля text
Логично. Увеличь его в шесть раз, и все получится.
> как указать серверу, что строки, передаваемые в запросе
> представлены в Юникоде
& #1074;& #1080;& #1076;& #1080;& #1084; - это не юникод. Это обычная ANSI-строка, в которой записаны юникодные коды символов.
← →
Aldor_ (2007-01-03 10:33) [3]
> DrPass © (03.01.07 10:22) [2]
> Логично. Увеличь его в шесть раз, и все получится.
Нужно чтобы структура таблиц и параметры атрибутов были неизменны (чтобы была копия базы)
> & #1074;& #1080;& #1076;& #1080;& #1084; - это не юникод.
> Это обычная ANSI-строка, в которой записаны юникодные коды
> символов.
Да, Вы правы, и проблема как раз в том, чтобы SQL-сервер "понял", что это коды юникод-символов, записанные в ANSI, а не произвольная ANSI-строка.
← →
DrPass © (2007-01-03 11:07) [4]
> проблема как раз в том, чтобы SQL-сервер "понял", что это
> коды юникод-символов
Вполне логично, что преобразование данных - это не задача SQL-сервера, а задача программы, которая выполняет вставку данных. Если речь идет о Delphi-приложении, то нужно преобразовать последовательность в WideString, и добавить ее в оператор INSERT через параметр
← →
Aldor_ (2007-01-03 12:17) [5]
> Вполне логично, что преобразование данных - это не задача
> SQL-сервера, а задача программы, которая выполняет вставку
> данных. Если речь идет о Delphi-приложении, то нужно преобразовать
> последовательность в WideString, и добавить ее в оператор
> INSERT через параметр
В том и вопрос, а может ли SQL-интерпретатор сервера выполнить эту работу
← →
DrPass © (2007-01-03 12:51) [6]Нет, конечно. В крайнем случае можно попробовать написать хранимую процедуру, в которой будет выполняться преобразование данных, и вставлять данные через нее (правда, я не знаю возможностей MySQL в этой части). С триггером на вставку не получится, т.к. длина строки будет проверяться еще до срабатывания триггера.
← →
Aldor_ (2007-01-03 13:23) [7]
> DrPass © (03.01.07 12:51) [6]
Спасибо, неожиданный для меня ответ :)
Буду пытаться сделать dump базы таким образом, чтобы строки не отображались в виде &-последовательностей.
Страницы: 1 вся ветка
Текущий архив: 2007.03.25;
Скачать: CL | DM;
Память: 0.48 MB
Время: 0.027 c