2016-08-18 2 views
0

Мне нужно сделать процедуру, и в качестве базовой точки я должен получить длину байта строки с двухбайтовыми символами. Но по очень странной причине, когда я использую функцию LENGHT() в процедуре моего экземпляра MySQL v5.5.50, я получаю подсчет общего количества символов .... Не количество байтов строки.Функция MySQL LENGTH() внутри Prodedure не возвращает длину строки в виде байтов

Это функция "тестирование" (экспорт PHPMyAdmin):

CREATE DEFINER=`root`@`localhost` FUNCTION `prueba`(`cadena` VARCHAR(256)) RETURNS longtext CHARSET latin1 
    NO SQL 
BEGIN 

RETURN LENGTH(cadena); 

END 

Эта функция возвращает:

SELECT prueba ("à"); 

prueba ("à") 
============= 
1 

Что я делаю неправильно? :(

Это функция реальной работы:

DROP FUNCTION IF EXISTS TRACKLIST; 
DELIMITER // 
CREATE FUNCTION TRACKLIST(v_codAlbum INT) RETURNS LONGTEXT 

BEGIN 

DECLARE v_finished INTEGER DEFAULT 0; 
DECLARE v_salida LONGTEXT DEFAULT ""; 
DECLARE v_track LONGTEXT DEFAULT ""; 
DECLARE v_artist LONGTEXT DEFAULT ""; 

DECLARE v_total_tracks INTEGER DEFAULT 0; 
DECLARE v_tracknum INTEGER DEFAULT 0; 
DECLARE v_titlelen INTEGER DEFAULT 0; 
DECLARE v_artistlen INTEGER DEFAULT 0; 

DECLARE curs CURSOR FOR 
    SELECT Titulo 
    FROM tracks t1 INNER JOIN artistas t2 
    where t1.IdContenido = t2.IdContenido 
    and idAlbum = v_codAlbum 
    and NumeroTrack > 0 
    order by numerotrack asc; 

DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_finished = 1; 

-- Recupero el numero de Canciones (tracks) 
SELECT count(*) INTO v_total_tracks 
FROM tracks t1 INNER JOIN artistas t2 
where t1.IdContenido = t2.IdContenido 
and idAlbum = v_codAlbum 
and NumeroTrack > 0; 

-- Recupero el nombre del Artista 
SELECT t2.Descripcion INTO v_artist 
FROM albumes t1 INNER JOIN interpretes t2 
WHERE t1.idInterprete = t2.idInterprete 
and t1.idAlbum = v_codAlbum; 

-- Inicializo la estructura de datos de tracklist 
SET v_salida = CONCAT('a:', v_total_tracks, ':{'); 
SET v_tracknum = 0; 

OPEN curs; 

-- Comienzo LOOP para agregar las canciones (tracks) 
get_tracks: LOOP 
    FETCH curs INTO v_track; 
    IF v_finished = 1 THEN 
    LEAVE get_tracks; 
    END IF; 

    -- Calculo el tamaño del string de nombre de cancion y nombre de Artista, necesario para agregar a la estructura de datos 
    SET v_titlelen = LENGTH(v_track); 
    SET v_artistlen = LENGTH(v_artist); 


    -- Estructura de datos con Nombre de Cancion y Nombre de Artista, solo estos datos 
    SET v_salida = CONCAT(v_salida,'i:',v_tracknum,';a:5:{'); 
    SET v_salida = CONCAT(v_salida,'s:24:"releasetrack_track_title";s:',v_titlelen,':"',v_track,'";'); 
    SET v_salida = CONCAT(v_salida,'s:24:"releasetrack_artist_name";s:',v_artistlen,':"',v_artist,'";'); 

    -- Este puto campo es requerido para que todo funcione. 
    SET v_salida = CONCAT(v_salida,'s:21:"releasetrack_mp3_demo";s:0:"";'); 

    -- Estos campos solo son requeridos para que funcione la aplicacion. 
    -- SOLO SE INCLUYEN EN LA CANCION "0" 

    IF v_tracknum = 0 THEN 
    SET v_salida = CONCAT(v_salida,'s:18:"releasetrack_scurl";'); 
    SET v_salida = CONCAT(v_salida,'s:0:"";'); 
    SET v_salida = CONCAT(v_salida,'s:19:"releasetrack_buyurl";'); 
    SET v_salida = CONCAT(v_salida,'s:0:"";'); 
    END IF; 

    -- Cierro Estructura para datos de una cancion 
    SET v_salida = CONCAT(v_salida,'}'); 

    SET v_tracknum = v_tracknum + 1; 
END LOOP get_tracks; 
CLOSE curs; 

-- Cierro Estructura de toda la lista de Canciones 
SET v_salida = CONCAT(v_salida,'}'); 

-- 
RETURN v_salida; 

END// 
DELIMITER ; 

Вот информация о кодировке и кодировании функций

DETAILS

DETAILS

+1

Вы действительно ошибаетесь 'LENGTH()'? – Barmar

+0

Ничего из этого не является правильным синтаксисом для создания функции в MySQL. Команда 'CREATE FUNCTION', и вам нужно указать тип возврата с предложением' RETURNS INT'. Пожалуйста, покажите фактическое определение функции, которое не сообщает о синтаксической ошибке. – Barmar

+0

Проблема заключается в том, что 'cadena' не рассматривается как многобайтовая строка в функции. 'RETURN ORD (cadena)' возвращает '225', а не' 50081'. – Barmar

ответ

1
  • Пожалуйста, посмотрите на SHOW CREATE PROCEDURE Я думаю, вы найдете, чтоПредполагается, чтоCHARACTER SET latin1, а не utf8.
  • В latin1, à всего 1 байт (Hex E0). utf8 будет 2 байта (hex C3A0).
  • Кажется странным возвращать числовые значения как LONGTEXT. (Это не связано с вопросом.)
+0

Я нашел рабочий стол, но я ищу элегантное решение. Я знаю, что это на декларации функции. «ФУНКЦИЯ ДРОПА, ЕСЛИ СУЩЕСТВУЕТ ПРИУБА; DELIMITER // CREATE FUNCTION prueba (cadena VARCHAR (256)) RETURN LONGTEXT НАЧАЛО ДЛИНА ВОЗВРАТА (КОНВЕРТ (cadena USING utf8)); END // DELIMITER; ' – ViktorWest77

 Смежные вопросы

  • Нет связанных вопросов^_^