创建表时字符集必须选utf8mb4而非utf8,存储引擎优先InnoDB,表名须合法且小写,主键应在建表时立即设定;四者需在保存前确认,否则易引发emoji乱码、锁表、SQL报错等问题。
创建表时字符集选 utf8mb4 而不是 utf8
php 的 utf8 实际对应 mysql 的 utf8mb3,不支持 emoji 和部分生僻汉字;utf8mb4 才是真正的 utf-8 实现。phpmyadmin 默认下拉菜单里有 utf8 和 utf8mb4 两个选项,必须手动选后者。
常见错误现象:插入 emoji 后变成 ???,或中文显示乱码但查询日志没报错;这往往不是连接层问题,而是建表时字符集就错了。
- 表级字符集设为
utf8mb4,排序规则推荐utf8mb4_unicode_ci(兼顾大小写和多语言)或utf8mb4_general_ci(旧版兼容,但已不推荐) - 如果数据库本身默认字符集是
utf8,新建表仍会继承它——得在 phpMyAdmin 的「操作」页手动改,不能只信「默认」 -
CHAR、VARCHAR字段无需单独设字符集,只要表级设对,它们自动继承;但TEXT类型字段也一样适用
存储引擎选 InnoDB,别碰 MyISAM
除非你明确要全文索引且不用事务,否则一律用 InnoDB。phpMyAdmin 新建表页面的「存储引擎」下拉框里,MyISAM 仍存在,但它不支持外键、崩溃后恢复不可靠、并发写入性能差。
使用场景:只要表涉及用户数据、订单、关联更新,就必须用 InnoDB;哪怕只是临时记录日志,也建议统一用它,避免后续加外键或事务时重构表结构。
-
InnoDB默认开启行级锁,MyISAM是表级锁——高并发下后者极易卡死 - phpMyAdmin 创建完表后,可在「结构」页顶部看到当前引擎,点「操作」可在线切换,但大表转换可能锁表数秒,生产环境慎用
- MySQL 8.0+ 已将
InnoDB设为全局默认,但 phpMyAdmin 界面不会自动同步这个设置,仍需手动确认
表名不要用数字开头或含特殊符号
phpMyAdmin 允许输入任意字符串当表名,但 MySQL 对标识符有严格限制:123users、user-name、user name 都会导致后续 SQL 报错,比如 Unknown column 'user-name' in 'field list' 或语法解析失败。
立即学习“PHP免费学习笔记(深入)”;
真实报错常出现在 PHP 代码执行 SELECT * FROM user-name 时,而不是建表那一刻——因为 phpMyAdmin 会自动给这类名字加反引号,掩盖了问题。
- 合法表名:以字母或下划线开头,只含字母、数字、下划线,如
user_profile、log_2024 - 若已有非法表名,phpMyAdmin「操作」页可重命名,新名必须符合规则,旧名在 SQL 中需始终用反引号包裹,例如
`user-name` - 表名区分大小写取决于系统配置(Linux 默认敏感,Windows 不敏感),统一小写最稳妥
字段定义后立刻设主键,别等建完再补
phpMyAdmin 在「创建表」页底部提供「索引」下拉菜单,很多人习惯先填字段、点「保存」,再进「结构」页去加主键——这会触发一次 ALTER TABLE,对大表可能锁表几十秒,且中间状态无主键,容易被其他脚本误读为「临时表」而跳过处理。
正确做法是在字段列表末尾,勾选某列的「索引」为 PRIMARY,或者点击「索引」标签页新增主键索引并指定字段。
- 主键字段必须
NOT NULL,phpMyAdmin 不会自动帮你勾,得手动点「空」列取消勾选 - 自增主键推荐用
BIGINT UNSIGNED(而非INT),避免未来 ID 溢出;类型选INT时记得勾「A_I」(Auto-Increment) - 没有自然主键时,别用
UUID字符串做主键——索引碎片高、JOIN 性能差;用BIGINT自增 + 单独加uuid字段更实际
字符集、引擎、表名、主键——这四个点在点击「保存」前就得定死。后面加字段、调索引都好办,初始这四步一旦出错,轻则多一次 ALTER TABLE,重则数据迁移或应用逻辑返工。











