2010-02-03 3 views
2

J'essaye actuellement d'ajuster les valeurs stockées dans une table dans MySQL. Les valeurs stockées contiennent une série de caractères Unicode. Je dois tronquer à 40 octets d'une valeur de stockage, mais lorsque je tente:Commande de troncature MySQL - caractères unicode

UPDATE `MYTABLE` SET `MYCOLUMN` = LEFT(`MYCOLUMN`, 40); 

MySQL est trop utile et conserve 40 caractères , au lieu de 40 octets. Y a-t-il un moyen de contourner ceci?

Cordialement et avec grâce,

gaioshin

Répondre

3

Je ne suis pas sûr si vous voulez vraiment tronquer à exactement 40 octets.

Étant donné que les caractères Unicode peuvent être endommagés, la condition doit être "MAX 40 octets AVEC le dernier caractère en cours de validité".

J'écrirais une fonction stockée pour cela. Je ne suis pas sûr que cela fonctionne, mais je suppose que, vous attrapez ma dérive:

DELIMITER &&& 
CREATE FUNCTION MYTRUNCATE (subject VARCHAR(255) CHARACTER SET utf8, max_bytes INT UNSIGNED) 
RETURNS VARCHAR(255) CHARACTER SET utf8 
DETERMINISTIC 
BEGIN 
DECLARE byte_len INT; 
DECLARE char_len INT; 
DECLARE res VARCHAR(255) CHARACTER SET utf8; 
SET res = LEFT(subject, max_bytes); 
SET byte_len = BIT_LENGTH(res)/8; 
SET char_len = CHAR_LENGTH(res); 
WHILE byte_len > max_bytes DO 
SET char_len = char_len - 1; 
SET res = LEFT(res, char_len); 
SET byte_len = BIT_LENGTH(res)/8; 
END WHILE; 
RETURN res; 
END&&& 
DELIMITER ; 
+0

Travailler sur une solution correcte Je voulais juste vous donner l'idée rapidement – uuid0

+0

Cela semble fonctionner maintenant.Ajustez "CHARACTER SET utf8" à celui que vous utilisez – uuid0

+0

Cool superbe - juste utilisé et il semble très bien fonctionner - merci! – Gaioshin

0

GAUCHE est octets. Que diriez-vous de modifier le type de données de la colonne pour qu'il ne puisse contenir que 40 octets. MySQL fera automatiquement la troncature pour vous.

ALTER TABLE table_name 
    MODIFY column_name column_type_40_bytes; 
+0

Juste changé la définition, mais malheureusement, il n'a pas fonctionné - et je ne peux pas sembler trouver un moyen de forcer MySQL à définir comme 40 octets, plutôt que 40 caractères :( – Gaioshin