utf8 編碼為 1~3 個 字节
utf8mb4 編碼為 1~4 個 字节
UTF-8:一个汉字 = 3个字节,英文是一个字节
varchar(n) 表示n个字符,无论汉字和英文,MySql都能存入 n 个字符,仅实际字节长度有所区别。
MySQL检查长度,可用SQL语言
SELECT LENGTH(fieldname) FROM tablename
以下為網友使用 UTF-8 的實驗
>> "我爱Ruby".size
=> 6
>> "I Love Ruby!".size
=> 12
mysql> select * from str_test;
+------------+--------------+
| name_chn | name_en |
+------------+--------------+
| 我爱Ruby | I Love Ruby! |
+------------+--------------+
1 row in set (0.02 sec)
mysql> select length(name_chn) from str_test;
+------------------+
| length(name_chn) |
+------------------+
| 10 |
+------------------+
1 row in set (0.01 sec)
3[一个汉字三字节] * 2 + 1[一个英文一字节] * 4 = 10
mysql> select length(name_en) from str_test;
+-----------------+
| length(name_en) |
+-----------------+
| 12 |
+-----------------+
1 row in set (0.00 sec)
10[一个英文一字节] * 1 + 2[空格一字节] * whitespace = 12
关于varchar 最多能存多少值
mysql的记录行长度是有限制的,不是无限长的,这个长度是64K,即65535个字节,对所有的表都是一样的。
MySQL对于变长类型的字段会有1-2个字节来保存字符长度。
当字符数小于等于255时,MySQL只用1个字节来记录,因为2的8次方减1只能存到255。
当字符数多余255时,就得用2个字节来存长度了。
在utf-8状态下的varchar,最大只能到 (65535 - 2) / 3 = 21844 余 1。
結論:
從 MySQL 8 開始,預設的 CHARSET 為 utf8mb4,COLLATE 為 utf8mb4_0900_ai_ci
所以 VARCHAR 理論上可以儲存大約 (65535-2)/4 = 16383,
實測後最大為 VARCHAR(16331)
參考資料:
https://21st.each1.net/2017/03/mysql.html
https://ruby-china.org/topics/24920