Mysql 使用默认字符集创建仅限整数的表,好主意吗?

Mysql 使用默认字符集创建仅限整数的表,好主意吗?,mysql,percona,Mysql,Percona,当我创建一个表时,即使它只使用整数,我也会将默认字符集设置为utf8(因为我复制粘贴代码,并且为了防止将来引入字符串列) 例如: 创建表(如果不存在)`articles`( `id`smallint(6)无符号非空, `已禁用'tinyint(1)未签名非空默认值0, 主键(`id`) )ENGINE=InnoDB默认字符集=utf8; 但是,我想知道在一个不使用默认字符集的表中有一个默认字符集是否会影响“性能”。表无论如何都有一个字符集,所以不,没有性能问题,UTF-8是一个很好的默认选择(

当我创建一个表时,即使它只使用整数,我也会将默认字符集设置为utf8(因为我复制粘贴代码,并且为了防止将来引入字符串列)

例如:

创建表(如果不存在)`articles`(
`id`smallint(6)无符号非空,
`已禁用'tinyint(1)未签名非空默认值0,
主键(`id`)
)ENGINE=InnoDB默认字符集=utf8;

但是,我想知道在一个不使用默认字符集的表中有一个默认字符集是否会影响“性能”。

表无论如何都有一个字符集,所以不,没有性能问题,UTF-8是一个很好的默认选择()。但你还是不应该那样做

除非需要指定默认字符集,否则添加默认字符集是一种不好的做法。这将覆盖数据库的默认字符集,该字符集可能不是
utf8
。您正在冒险创建一个字符集与其他表不同的表,从而导致混乱

相反,请确保服务器和数据库字符集设置正确。然后,让您的表使用默认值,除非您有特殊的理由这样做

例如,UTF-8是一个很好的默认选择,但是<代码>utf8无法处理所有UTF-8。您应该改为使用(UTF-8 4字节)。数据库可能正确地使用了
utf8mb4
,但您正在使用功能较差的字符集覆盖它


请参阅和。

表创建底部的
默认字符集
子句仅为元数据。仅当添加CHAR/VARCHAR/TEXT列且未显式定义该列的字符集时,才使用它。然后使用表的默认字符集

表没有任何性能特征——它们只是存储。查询具有良好的性能


由于表中没有包含字符集的列,因此不能对该表进行受字符集影响的查询。因此,默认字符集无效。

。如果你忽略了
CHARSET=utf8
,你想在时间上或资源使用上赢得什么?我不知道,我是在向专家咨询
smallint
无疑是一个过早的优化,你会后悔的。ID很快就用完了,32767比你想象的要小。使用。我不认为这是过早的,因为我知道它永远不会使用超过2000个ID:当预测未来时,你只能依靠一个预测;你的预测是错误的。是为意外情况(如ID耗尽)准备代码的技巧。为了节省6000字节,这是一个毫无意义的量,如果你点击了ID32768,你就冒着神秘失败的风险。请注意,您的ID不是自动递增的。现在mysql使用utf8作为utf8mb4Thank的同义词。我还没有使用mysql 8,而且这个sql可能会被其他人共享,因此我认为在这种情况下需要设置默认字符集(因为人们可能会有另一个字符集作为默认字符集)@nbk他们将来可能会更改它。我们不知道他们使用的是什么版本。@Barbz_YHOOL这正是我所指的混乱。您希望使用它们的默认值。例如,您不希望您的表使用utf8mb3,其余的表使用latin1。最好使用他们数据库的字符集,这就是他们将字符串编码为的字符集。@Barbz_YHOOL导入和导出表和数据是另一个问题。“包含一组带有英语字符串的数据”语言不定义字符集;英语可以存储在许多不同的字符集中。当UTF-8成为默认值时,它变得容易多了,但字符集和编码总是很复杂,必须仔细考虑。试图为所有情况找到一个全面的解决方案往往会使问题变得更糟。