我需要创建一个过程,作为它的核心点,我必须得到一个带有双字节字符的字符串的字节长度。但是,当我在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和编码
答案 0 :(得分:1)
SHOW CREATE PROCEDURE
。我想你会发现cadena
被认为是CHARACTER SET latin1
,而不是utf8。à
只有1个字节(Hex E0
)。 utf8将是2个字节(十六进制C3A0
)。LONGTEXT
返回似乎很奇怪。 (这与这个问题无关。)