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