MySQL 过程中的函数 LENGTH() 不会 return 字符串长度为字节

MySQL function LENGTH() inside a Prodedure doesnt return string length as bytes

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

这是"testing"函数(phpmyadmin导出):

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

RETURN LENGTH(cadena);

END

这个函数returns:

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

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