我有一个存储用户输入的表,因此为了允许国家字符,我将 charset 设置为utf8mb4。
然后我有第二个表,它可以变得非常大(100+ 数百万行),我 100% 确定这个表将只存储 ASCII 字符,所以我将此表的字符集设置为latin1以节省磁盘空间。
在一个数据库中的表之间使用不同的字符集有什么缺点吗?它被认为是不好的做法吗?
或者有没有其他方法可以解决这个问题?(以保持磁盘占用最小并允许国家字符)
编辑:
其输出show create table
需要用户输入(并具有 utf8mb4)
CREATE TABLE `sensor` (
`id` int(20) NOT NULL AUTO_INCREMENT,
`label` varchar(191) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`description` varchar(3000) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`created` datetime(6) NOT NULL,
`state` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`region` varchar(255) COLLATE utf8mb4_unicode_ci DEFAULT NULL,
`model_reference` int(11) DEFAULT NULL,
PRIMARY KEY (`id`),
UNIQUE KEY `label` (`label`),
KEY `id` (`id`),
KEY `sensor_ibfk_1` (`model_reference`),
FULLTEXT KEY `fulltext_index`(`label`,`description`,`state`,`region`),
CONSTRAINT `sensor_ibfk_1` FOREIGN KEY (`model_reference`) REFERENCES `model` (`id`) ON DELETE SET NULL ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_ci
其输出show create table
是自动生成的(并且具有 latin1)
CREATE TABLE `sensor_history` (
`id` int(11) NOT NULL AUTO_INCREMENT,
`sensor_reference` int(20) DEFAULT NULL,
`temperature` varchar(16) DEFAULT NULL,
`pressure` varchar(16) DEFAULT NULL,
`at` timestamp(6) NOT NULL DEFAULT CURRENT_TIMESTAMP(6),
PRIMARY KEY (`id`),
KEY `sensor_history_ibfk_1` (`sensor_reference`),
CONSTRAINT `sensor_history_ibfk_1` FOREIGN KEY (`sensor_reference`) REFERENCES `sensor` (`id`) ON DELETE CASCADE ON UPDATE NO ACTION
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1
每个数据库的每个表的每一列都可以有不同的
CHARACTER SET
和COLLATION
。除非您JOIN
在具有不同字符集和/或排序规则的列上,否则没有缺点。Ascii(7 位内容)是 latin1 和 utf8mb4 的子集。因此,编码是相同的,因此对于纯 ascii 文本不会看到空格差异。
但是,当您声明不必要的大字符串时会出现一些问题,尤其是对于更宽的字符集。 可能你不会遇到任何问题。请提供
SHOW CREATE TABLE
对可能情况的审查。客户端必须声明它正在使用什么字符集,所以
UTF-8
你需要在那里。在这种情况下,任何非 utf8mb4 列在客户端和服务器之间传输时都会自动转换。更多的
存储到
VARCHAR(...) CHARACTER SET utf8mb4
时,有 1 字节或 2 字节长度的开销,加上与
CHARACTER SET latin1
:对于清晰的航行:
CHARACTER SET
可以保存字符的 a (显式或隐式)声明该列。(英语适用于任何字符集,但 Emoji 仅适用于 utf8mb4。)SET NAMES
)必须正确说明客户端使用的编码。