1. MySQL:
1.1 CHAR(n)
1.1. 存储固定长度(n)的字符串。n 范围是 [0, 255]。n 的缺省值为 1.
1.2. 当插入的字符串长度小于 n 时,MySQL 会在末尾补充空格。查询的时候,MySQL 会删除末尾的空格(不会删除头部空格)。
1.3. MySQL 在处理 >、 >=、 <、 <=、 =、 LIKE 这样的操作符时,不会考虑末尾的空格。
1.2. VARCHAR(n)
1.2.1. n 不可以省略。
1.2.2. VARCHAR 类型的 column 最大占用空间是 65535 Byte。
1.2.3. MySQL 会在字符串前面加 1 或 2 个字节的前缀,这个前缀是用来保存这 column 的长度的。当 column 暂用空间小于 255 时,前缀暂用一个字节,否则暂用两个字节。
1.2.3.1. 当 column 不可以为空(not null)时,所保存的字符串最长是 (65535 - 2 = 65533) Byte。
1.2.3.2. 当 column 可以为空时,所保存的字符串最长是 (65535 - 2 - 1 = 65533) Byte。额外的 1 字节存放 null。[1]
1.2.4. 不能设置多列为 VARCHAR(635532),因为 MySQL 有限制(max row size)。
1.2.5. 如果插入的字符串长度大于 n ,就会报错,插不进去。[2]
1.2.6. 插入字符串时候,不会填充空格,也不会删除空格。(特例:如果包含空格会长度大于 n,删除末尾的空格就不大于 n 的时候,MySQL 会删除末尾的空格。[2])
1.3. TEXT
1.3.1. 与 VARCHAR 不同,TEXT 不会保存字符串的长度。
1.3.2. 不会添加 / 删除空格。
1.3.4. 不会保存在内存里,所以读取的时候需要额外的开销。在 SELECT 查询中,TEXT 性能较低。
1.3.5. TEXT 有 4 种类型,空间从 256 B 到 4 GB:
1.3.5.1. TINYTEXT: 255 characters - 255 B
1.3.5.1. TEXT: 65,535 characters - 64 KB
1.3.5.1. MEDIUMTEXT: 16,777,215 - 16 MB
1.3.5.1. LONGTEXT: 4,294,967,295 characters - 4 GB
1.4. BLOB
1.4.1. BLOB 主要用于存储二进制数据,比如图片、视频、可执行文件。
2. PoregreSQL 与 MySQL 不同的地方:
2.1. 对于 VARCHAR,PostgreSQL 如果不指定 n,就和 TEXT 一样。(MySQL 不指定 n 会报错)
2.2. 对于 TEXT, PostgreSQL 是没有长度限制的。(MySQL 有4 种类型的 TEXT)
2.3. 更多对比,可以参考 MySQL 官网。[5]
参考:
1. https://stackoverflow.com/questions/8295131/best-practices-for-sql-varchar-column-length
2. http://www.mysqltutorial.org/mysql-varchar/
3. https://chartio.com/resources/tutorials/understanding-strorage-sizes-for-mysql-text-data-types/
4. http://www.postgresqltutorial.com/postgresql-char-varchar-text/
5. https://dev.mysql.com/doc/workbench/en/wb-migration-database-postgresql-typemapping.html