Мне нужно сделать процедуру, и в качестве базовой точки я должен получить длину байта строки с двухбайтовыми символами. Но по очень странной причине, когда я использую функцию 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 ;
Вот информация о кодировке и кодировании функций
Вы действительно ошибаетесь 'LENGTH()'? – Barmar
Ничего из этого не является правильным синтаксисом для создания функции в MySQL. Команда 'CREATE FUNCTION', и вам нужно указать тип возврата с предложением' RETURNS INT'. Пожалуйста, покажите фактическое определение функции, которое не сообщает о синтаксической ошибке. – Barmar
Проблема заключается в том, что 'cadena' не рассматривается как многобайтовая строка в функции. 'RETURN ORD (cadena)' возвращает '225', а не' 50081'. – Barmar