Prodedure中的MySQL函数LENGTH()不会将字符串长度作为字节返回

时间:2016-08-18 02:00:30

标签: mysql database stored-procedures mariadb etl

我需要创建一个过程,作为它的核心点,我必须得到一个带有双字节字符的字符串的字节长度。但是,当我在MySQL v5.5.50实例的过程中使用LENGHT()函数时,出于一个非常奇怪的原因,我得到了字符总数的计数....不是字符串的字节数。

这是"测试"功能(phpmyadmin export):

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 ;

以下是有关功能的详细信息。 charset和编码

DETAILS

DETAILS

1 个答案:

答案 0 :(得分:1)

  • 请查看SHOW CREATE PROCEDURE。我想你会发现cadena被认为是CHARACTER SET latin1,而不是utf8。
  • 在latin1中,à只有1个字节(Hex E0)。 utf8将是2个字节(十六进制C3A0)。
  • 将数值作为LONGTEXT返回似乎很奇怪。 (这与这个问题无关。)