Главная страница
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.033 c
1-1170400528
mmms
2007-02-02 10:15
2007.03.25
Как узнать завершения потока? По окончанию сделать Showmessage...


15-1172611365
Gero
2007-02-28 00:22
2007.03.25
Лебедев облажался


1-1170534006
Express
2007-02-03 23:20
2007.03.25
Как перехватить сообщение об открытие MDI-формы??


15-1172765069
PHPdeveloper
2007-03-01 19:04
2007.03.25
проблема с установкой.


2-1172999997
azl
2007-03-04 12:19
2007.03.25
Сортировка записей в текстовом файле