Mysql 5中列级别的CHARSET

Posted

技术标签:

【中文标题】Mysql 5中列级别的CHARSET【英文标题】:CHARSET on column level in Mysql 5 【发布时间】:2011-05-29 13:59:16 【问题描述】:

我的应用程序有一个表,其中有两列需要 utf8,其他列是拉丁文。根据定义,拉丁字符不包含非拉丁字符,而 utf8 字符可能包含也可能不包含 utf8 字符。一个 utf8 列已编入索引,另一列未编入索引。

我有三个问题:

在列级别混合字符集是一种好习惯吗?

如果一行(在此表上)仅包含拉丁字符而没有 utf8 字符,那么数据存储和索引大小会受到怎样的影响?换句话说,utf8 列数据/索引大小与拉丁文相同,但不存储任何 utf8 文本。

相对于拉丁语,utf8 列上的数据和索引存储如何量化?

谢谢

【问题讨论】:

【参考方案1】:

UTF-8 是一种可变长度编码。 ASCII set 中的字符将被编码为一个字节,如 latin1;超出此范围的字符将使用最多四个字节进行编码。由 ASCII 字符组成的字符串在 UTF8 和 latin1 中具有相同的长度。

在列级别混合字符集是一种好习惯吗?

我从来没有这样做过,并且倾向于说不,因为它不必要地使数据库架构复杂化。虽然数据库引擎应该能够很好地处理它,但出于存储考虑,我不会使用混合字符集。节省的钱最多是最少的。

我能想到的混合字符集的唯一正当理由是对特定排序顺序和/或区分大小写/重音/不区分搜索使用不同的排序规则。

【讨论】:

Pekka,存储和索引都需要 1 字节还是 4 字节?最多 4 个字节,如俄语 2 个字节或中文 4 个字节等等?有这些图表吗? 还有一个问题,德语变音符号是否超过 1 个字节,因为它们不是 US-ASCII?

以上是关于Mysql 5中列级别的CHARSET的主要内容,如果未能解决你的问题,请参考以下文章

如何修改 MySQL 表中列的大小?

使用正则表达式删除Mysql中列值中的括号()

Mysql:过滤表依赖于不同表中列的子字符串

mysql中列的增删改

MySQL - 基于选择查询中列的第一个字符进行过滤

有没有办法计算 MySql 中列的总数据大小?