【问题标题】:How can you trim a string to a certain byte length in MySQL?如何在 MySQL 中将字符串修剪为特定字节长度?
【发布时间】:2021-04-06 20:23:37
【问题描述】:

我有一个包含 253 个字符的字符串,但由于某些字符长于一个字节(在这种情况下,它包含几个零宽度空格),它占用了 261 个字节。

我想将此字符串插入到utf8mb4 表中的VARCHAR(255) 列中,但它会引发此错误:

INSERT INTO mytable(mycolumn) VALUES("This string contains 253 ​characters which should ​fit inside of a varchar(255) column, but because ​of the zero width spaces, it takes up more than 255 bytes and therefore throws an error when you try to insert it into the table and that makes me ​sad.")

/*Error 1406: Data too long for column*/

这是两个长度函数输出的示例:

/* Returns 253 */
SELECT CHAR_LENGTH("This string contains 253 ​characters which should ​fit inside of a varchar(255) column, but because ​of the zero width spaces, it takes up more than 255 bytes and therefore throws an error when you try to insert it into the table and that makes me ​sad.");

/* Returns 261 */
SELECT LENGTH("This string contains 253 ​characters which should ​fit inside of a varchar(255) column, but because ​of the zero width spaces, it takes up more than 255 bytes and therefore throws an error when you try to insert it into the table and that makes me ​sad.");

要解决这个问题,我需要剪掉足够的字符以使字符串在字节限制内。

不幸的是,LEFT() 函数似乎不适合这个:

/* Still returns 261 because it counts characters, not bytes */
SELECT LENGTH(LEFT("This string contains 253 ​characters which should ​fit inside of a varchar(255) column, but because ​of the zero width spaces, it takes up more than 255 bytes and therefore throws an error when you try to insert it into the table and that makes me ​sad.", 255));

那么,我该如何修剪字符串呢?

【问题讨论】:

标签: mysql substring trim utf8mb4


【解决方案1】:

一种解决方法是使用另一种语言提前处理字符串。

例如,这是一个使用 Python 的可行解决方案:

def trim_string_to_x_bytes(string, max_bytes, character_encoding):
    string = string[:max_bytes]
    
    while (len(string.encode(character_encoding)) > max_bytes):
        string = string[:-1]
    
    return string

long_string = "This string contains 253 ​characters which should ​fit inside of a varchar(255) column, but because ​of the zero width spaces, it takes up more than 255 bytes and therefore throws an error when you try to insert it into the table and that makes me ​sad."

long_string = trim_string_to_x_bytes(long_string, 255, 'utf8')

cursor.execute("INSERT INTO mytable(mycolumn) VALUES(%s)", (long_string,))

也就是说,如果存在一个纯 MySQL 解决方案会更好。

【讨论】:

    猜你喜欢
    • 2015-07-25
    • 1970-01-01
    • 2012-01-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-27
    • 2014-04-15
    • 1970-01-01
    相关资源
    最近更新 更多