MySQL 的 varchar 到底可以存幾個中文字或幾個英文字呢

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

程式語言編年史

程式語言編年史原文 下面這張圖片描繪了整個程式語言的歷史。包括各種程式語言的發明人、程式語言的特點和適用領域、被什麼網站或公司使用等 (檢視 完整高清圖 )。 之所以會有那麼多不同的程式語言是因為設計程式語言的初衷不同、對語言學習曲線的追求不同、不同程式之間的執行成本差異...