我要将数据(主要是维基百科页面标题)存储在一个表中,该表可以包含需要完整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
答案 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
,但应用程序必须确保数据完整性