Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 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.055 c
2-1172951338
KIBSOFT
2007-03-03 22:48
2007.03.25
Прога как бы зависает!


2-1172913668
tytus
2007-03-03 12:21
2007.03.25
Как пролистать ListView до нужной позиции?


15-1172951913
eXPell
2007-03-03 22:58
2007.03.25
Где-то ошибка...


15-1172660033
Сергей М.
2007-02-28 13:53
2007.03.25
FreeWare-софт для организации аудиоконференции в LAN


15-1172760867
Vlad Oshin
2007-03-01 17:54
2007.03.25
И вы молчали!!!? :))