2013-02-12 38 views
0
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`)); 

但我得到以下错误信息:mySQL VARCHAR(256)+ mySQL INT =多少个字节?

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

请告知

+0

只是测试这一点,它似乎好工作? – David 2013-02-12 23:45:51

+0

如果可能的话,你应该使用一个自动递增的整数或GUID而不是一个很长的varchar作为主键 – Patashu 2013-02-12 23:47:03

回答

1

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

如果可能的话,我会推荐使用UTF16以外的东西VARCHAR作为您的钥匙。

+0

那么选项是什么?我需要使用UTF来支持国际字符和特殊字符....... – 2013-02-12 23:50:09

+0

这是钥匙需要的吗? – 2013-02-12 23:50:41

+0

是的,我们需要在metadata_labels.label中支持国际字符 – 2013-02-12 23:52:30

1

在UTF8中,它需要3 x 256 + 4 = 772字节。 UTF16会再增加25%。

你不应该使用这么宽的主键;为了使索引高效,每个索引的存储应该保持最小。

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

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

如果Unicode是必须的,散列出来的照片,你应该减少列要么UTF8(250个字)或UTF-16(190个字)

+0

你在哪里3? – 2013-02-12 23:51:46

+0

@JasonMcCreary utf8对于每个字符可能需要1到3个字节的存储空间。 – 2013-02-12 23:53:50

+0

是否有一种方法,我不必添加另一个字段(散列)? – 2013-02-12 23:56:31