MySQL中完整UTF8支持的数据类型和排序规则

时间:2014-02-20 13:24:15

标签: mysql utf-8 character-encoding utf8mb4

我要将数据(主要是维基百科页面标题)存储在一个表中,该表可以包含需要完整UTF8的字符。 我正在使用的架构是

CREATE TABLE `en_brands` (
 `id` int(10) unsigned NOT NULL AUTO_INCREMENT,
 `name` varchar(191) CHARACTER SET utf8mb4 COLLATE utf8mb4_bin NOT NULL,
 `name_encoded` varchar(255) NOT NULL,
 `inserted` datetime NOT NULL,
 PRIMARY KEY (`id`),
 UNIQUE KEY `name` (`name`),
) ENGINE=InnoDB DEFAULT CHARSET=utf8 ROW_FORMAT=COMPACT

如您所见,name只有191个字符。当使用较大的值时,MySQL拒绝创建UNIQUE KEY name,因为这些密钥只能是767字节长。我有什么问题:

  • name_encoded至少TEXT才能完全存储URL编码的(用PHP rawurlencode)UTF8字符串吗? (我认为一个255字节长的字符串可以用最坏情况下的3060个字符长的URL表示 - 255个字符x 4个字节x 3个字符用于编码表示)
  • 我使用name_encoded的排序规则是否重要(我认为不是,因为网址编码它们应该适合latin
  • 我应该使用哪种数据类型和排序规则来name存储至少255个完全支持UTF8的字符,然后创建UNIQUE KEY(我想使用允许使用母语的排序规则)分选)

BTW:我在Debian Wheezy上使用MySQL 5.6 Percona

1 个答案:

答案 0 :(得分:0)

回答我的问题:

  

将name_encoded设置为至少TEXT以完全存储URL编码(in   PHP rawurlencode)UTF8字符串?

当然,URL编码的UTF8字符串最长可达3060个字符,因此需要TEXT

  

我使用哪个归类来进行name_encoded(我想不是,   因为URL编码它们应该适合拉丁语)

网址编码字符串适合ASCII

  

我应该使用哪种数据类型和排序规则来存储名称   支持完整UTF8的255个字符,用于创建UNIQUE KEY   然而

这是不可能的,因为UNIQUE KEY s

中文本列的长度限制

我首先执行SELECT来检查重复项,因此不需要UNIQUE KEY,但应用程序必须确保数据完整性