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

标签 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 使用哪种排序规则重要吗(我认为不是,因为 URL 编码的它们应该适合 latin)
  • 我应该使用哪种数据类型和排序规则来存储至少 255 个字符并完全支持 UTF8,并创建一个 UNIQUE KEY(我想使用允许母语排序的排序规则)

顺便说一句:我在 Debian Wheezy 上使用 MySQL 5.6 Percona

最佳答案

回答我的问题:

has name_encoded to be at least TEXT to fully store an URL-encoded (in PHP rawurlencode) UTF8 string?

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

does it matter which collation I use for name_encoded (I think not, because URL-encoded they should fit into latin)

URL 编码字符串适合 ASCII

which data type and collation should I use for name to store at least 255 characters with full UTF8 support and to create an UNIQUE KEY nevertheless

这是不可能的,因为 UNIQUE KEY 中文本列的长度限制

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

关于mysql - MySQL 中完全支持 UTF8 的数据类型和排序规则,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21909148/

相关文章:

php - 根据时间戳字段之间的差异过滤 MySQL 查询

android - 使用 MYSQL 查询结果进行 Realm 查询

Mysql 工作台错误 "system error:61"

php - 不同版本的 PHP、Apache 和 MySQL 之间的字符编码问题

java - 使用java从文件中读取特殊字符?

node.js - 将windows1252转换为NodeJS特殊字符中的utf-8

php - 选择时获取重复记录

html - 我如何获取 Nokogiri 抓取的 HTML 并将其作为 UTF-8 输出到终端?

php - utf-8 的 preg_match 规则

javascript - 在 Java 中将 ANSI 转换为 UTF-8