MySQL VARCHAR长度和UTF-8

16 浏览
0 Comments

MySQL VARCHAR长度和UTF-8

在MySQL中,如果我在一个UTF-8表中创建一个新的VARCHAR(32)字段,这意味着我可以在该字段中存储32个字节的数据还是32个字符(多字节)?

0
0 Comments

MySQL VARCHAR长度和UTF-8的问题导致的混淆可能是由于不同版本的MySQL进行测试。MySQL 4版本计算字节数,而MySQL 5版本计算字符数。根据MySQL 5的官方文档,MySQL将字符列定义中的长度规范解释为字符单位(在MySQL 4.1之前,列长度解释为字节)。有趣的是,varchar列的最大长度受utf8的影响。MySQL 5.0.3及更高版本中,varchar的有效最大长度取决于最大行大小(65,535字节,共享给所有列)和使用的字符集。例如,utf8字符可能每个字符需要多达三个字节,因此使用utf8字符集的varchar列的最大长度可以声明为21,844个字符。这意味着一个varchar(10)字段(使用utf8mb4)可以存储""(10个堆糞),这是10个字符但占用40个字节。这是唯一正确的答案,但很多人将版本4的行为视为定理。对于MySQL 5,已接受的答案也是正确的--插入的数字实际上是全角字符集的一部分,是多字节Unicode字符,如也由发帖者提到他插入了"32 multibytes data"。引用joelonsoftware.com/articles/Unicode.html的来源,我认为一个utf8字符目前需要多达6个字节,所以介于1到6个字节之间。这导致了字符最大长度的最坏情况为10922。目前,MySQL使用的是UTF-8的3字节变体,计划迁移到(标准的)4字节变体。这个答案也适用于MariaDB,这可能是预期的。

0
0 Comments

MySQL VARCHAR Lengths and UTF-8问题的出现原因是因为在存储UTF-8编码的字符时,MySQL在CHAR类型的列中必须为每个字符保留三个字节的空间,因为这是最大可能的长度。而UTF-8编码中,一个字符最多使用4个字节存储。因此,这导致了在VARCHAR类型的列中,存储UTF-8编码的字符时可能会出现长度限制的问题。

解决方法是使用VARCHAR代替CHAR来节省空间。在UTF-8编码下,VARCHAR类型的列在存储字符时只需保留实际字符的字节数即可。这样就避免了CHAR类型中每个字符都占用三个字节的问题。

MySQL提供了utf8mb4_xxx字符集来支持4字节长度的字符,但在较旧的版本中,仍然使用utf8_xxx字符集,其最大长度限制为3字节。因此,如果要存储4字节长度的字符,需要使用utf8mb4_xxx字符集。

随着时间的推移,MySQL可能会在未来的版本中使用标准的4字节UTF-8版本。但在目前的版本中,仍然使用较旧的utf8_xxx字符集。

,为了避免MySQL VARCHAR Lengths and UTF-8问题,应该使用VARCHAR类型来存储UTF-8编码的字符,并根据具体需求选择合适的字符集,如utf8mb4_xxx来支持4字节长度的字符。

0
0 Comments

MySQL VARCHAR长度和UTF-8

在使用MySQL的时候,有一位用户遇到了一个关于VARCHAR长度和UTF-8编码的问题。他在一个VARCHAR(32)的列中插入了一个包含40个Unicode字符的字符串,结果发现只有32个字符被保存了下来。这让他感到困惑,因为他以为VARCHAR(32)应该能够保存32个字符。

其实,这个问题的原因是MySQL在计算VARCHAR长度时使用了字节数而不是字符数。在UTF-8编码中,非ASCII字符占用的字节数是变长的,而ASCII字符只占用一个字节。因此,当用户插入包含非ASCII字符的字符串时,MySQL会根据字节数来计算长度,而不是根据字符数。

解决这个问题的方法是使用utf8mb4编码代替utf8编码。utf8mb4编码是MySQL中支持完整Unicode字符集的一种编码方式,它能够正确地计算非ASCII字符的长度。通过使用utf8mb4编码,用户可以将VARCHAR(32)中的32解释为32个字符,而不是32个字节。

需要注意的是,MySQL的版本也会对这个问题产生影响。在MySQL 4.0及之前的版本中,并没有真正的字符集概念,字节和字符基本上是等同的。而在MySQL 4.1及之后的版本中,才引入了字符集的概念,可以将字符集应用于列、表和数据库。

为了正确计算VARCHAR长度并支持UTF-8编码,用户应该使用utf8mb4编码代替utf8编码。这样可以确保非ASCII字符的长度正确计算,并且能够支持完整的Unicode字符集。

0