MySQL VARCHAR长度和UTF-8

Ali*_*xel 76 mysql unicode varchar utf-8

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

小智 159

这个答案显示在我的谷歌搜索结果的顶部,但不正确所以:

混淆可能是由于正在测试的不同版本的mysql.

  • 版本4计算字节数
  • 版本5计算字符

http://dev.mysql.com/doc/refman/5.0/en/string-type-overview.html

MySQL以字符为单位解释字符列定义中的长度规范.(在MySQL 4.1之前,列长度以字节为单位进行解释.)这适用于CHAR,VARCHAR和TEXT类型.

有趣的是(我没想过)varchar列的最大长度受utf8影响如下:

MySQL 5.0.3及更高版本中VARCHAR的有效最大长度受最大行大小(65,535字节,在所有列之间共享)和使用的字符集的限制.例如,utf8字符每个字符最多可能需要三个字节,因此使用utf8字符集的VARCHAR列可以声明为最多21,844个字符.

  • M Brown,谢谢你提到这一点.VARCHAR(10)字段(使用`utf8mb4`)可以存储""(10堆poo),即10个字符但40个字节. (42认同)
  • 这个.这是唯一正确的答案.很多人认为版本4的行为是福音. (3认同)
  • 对于MySQL 5,接受的答案也是正确的 - 插入的数字实际上是全宽字符集的一部分,并且是多字节的unicode字符,海报也提到他插入了"32多字节数据".遗憾的是,很多人都误解了. (2认同)
  • @usumoio 目前,MySQL 似乎使用 UTF-8 的 3 字节变体,并计划迁移到(标准)4 字节变体:https://dev.mysql.com/doc/refman/8.0/en /charset-unicode-utf8.html。 (2认同)

jsp*_*cal 8

它可以让你存储32个多字节字符

要使用UTF-8节省空间,请使用VARCHAR而不是CHAR.否则,MySQL必须为CHAR CHARACTER SET utf8列中的每个字符保留三个字节,因为这是可能的最大长度.例如,MySQL必须为CHAR(10)CHARACTER SET utf8列保留30个字节.

http://dev.mysql.com/doc/refman/5.0/en/charset-unicode.html

  • @jspcal:UTF-8每个字符最多使用4个字节,而不是3.或者MySQL不支持所有4个字节? (9认同)
  • @RemyLebeau你是关于utf8的,但不适用于MySQL.各种utf8_xxx字符集最多为3个字节.utf8mb4_xxx需要4个字节的字符.http://dev.mysql.com/doc/refman/5.5/en/charset-unicode-utf8mb4.html (4认同)

YOU*_*YOU 5

用于整理的32个多字节数据,我刚刚使用XAMPP进行了测试.varchar(32)utf8_unicode_ci

????????????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

被截断为:

????????????????????????????????
Run Code Online (Sandbox Code Playgroud)

请记住,这些不是常规的ASCII字符.

  • 我在DB中插入了40个unicode字符,并在32个字符处被截断.但看起来人们认为我使用ascii字节并被截断为32字节.难怪,我得到了投票,哈哈. (7认同)
  • 这是错误的,至少对MySQL 5+来说是这样.为varchar或char指定列大小时,将根据字符指定.我相信VARCHAR(32)列的实际大小是32x3 + 1 = 97字节. (5认同)
  • @rjmackay'12345'不是标准的ASCII字符.http://en.wikipedia.org/wiki/Halfwidth_and_Fullwidth_Forms_(Unicode_block) (5认同)
  • 在UTF-8标准中,ASCII字符只存储在一个字节中 - 要真正测试这一点,你需要在测试中实际使用一些多字节(即非ascii)字符. (4认同)
  • @ButtleButkus"我相信VARCHAR(32)列的实际大小将是32x3 + 1 = 97字节"如果你使用`utf8`,那么你会在MySQL中得到破解的Unicode支持.您应该使用`utf8mb4`编码,因为有[max.utf-8 char中的4个字节](https://stijndewitt.wordpress.com/2014/08/09/max-bytes-in-a-utf-8-char/),而不是MySQL的utf8变体中的3个字节... (2认同)