【问题标题】:mySQL VARCHAR(256) + mySQL INT = how many bytes?mySQL VARCHAR(256) + mySQL INT = 多少字节?
【发布时间】:2013-02-12 23:42:45
【问题描述】:
CREATE SCHEMA IF NOT EXISTS `utftest`  DEFAULT CHARACTER SET utf16;
CREATE  TABLE IF NOT EXISTS `metadata_labels` (`metadata_id` INT NOT NULL , `label` VARCHAR(256) NOT NULL ,  PRIMARY KEY (`metadata_id`, `label`));

但是我收到以下错误消息:

Specified key was too long; max key length is 767 bytes

请指教

【问题讨论】:

  • 刚刚测试过,似乎可以正常工作?
  • 如果可能,您应该使用自动递增的整数或 GUID 而不是很长的 varchar 作为主键

标签: mysql database int varchar utf-16


【解决方案1】:

UTF 16 在 MySQL 中使用 32 bits per character(4 个字节)。 4 x 256 > 767.

如果可能,我建议您使用 UTF16 VARCHAR 以外的其他方式作为您的密钥。

【讨论】:

  • 那么选项是什么?我需要使用 UTF 来支持国际字符和特殊字符.......
  • 密钥是否需要?
  • 是的,我们需要在 metadata_labels.label 中支持国际字符
【解决方案2】:

在 UTF8 中,它需要 3 x 256 + 4 = 772 字节。 UTF16 将再多占用 25%。

您不应该使用如此宽的主键;为了使索引高效,每个索引的存储量应保持在最低限度。

如果您需要防止重复,我建议添加一个包含内容哈希(例如 sha1)的计算字段,并在其上创建一个唯一约束。

或者,使用latin1 作为label 字段的字符编码,将字节数减少到256 + 4 = 300

如果必须使用 Unicode 并且不考虑哈希值,则应将该列减少为 UTF8(250 个字符)或 UTF16(190 个字符)

【讨论】:

  • @JasonMcCreary utf8 每个字符可能需要 1 到 3 个字节的存储空间。
  • 有没有一种方法我不必添加另一个字段(哈希)?
  • @SaqibAli 您可以尝试将字段宽度减小到 250。
  • 问题引用了utf16,即4个字节。
  • 谢谢@Jack。我现在已经这样做了。但我们需要找出更好的数据库架构
猜你喜欢
  • 2013-10-02
  • 1970-01-01
  • 2011-05-31
  • 2010-11-12
  • 2012-11-10
  • 2013-07-24
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多