MySQL建表必须显式指定列类型、ENGINE和CHARSET,VARCHAR需带长度,DATETIME优于TIMESTAMP,AUTO_INCREMENT仅支持单整数主键,外键仅InnoDB有效且要求字段完全一致。
CREATE TABLE 语句必须显式指定列类型,不能靠“自动推断”
MySQL 不支持像某些 NoSQL 或现代 ORM 那样根据值自动设类型。写
时,每一列的类型(如
、
、
)都得手动写清楚,漏一个就报错。
常见错误现象:
—— 很可能是给
列加了
或没加
却设了默认值;或者用了
却没写长度,比如写成
而非
。
必须带括号长度,
是 InnoDB 索引限制下的安全上限(尤其配合 utf8mb4)
不等于布尔值,它只是显示宽度,存数字 0–255;真要逻辑标识,用
并靠应用层约定
时间字段优先选
(范围大、无时区依赖),而非
(自动更新、受时区影响、2038 年问题)
主键和自增必须配对使用,且仅限一列
MySQL 的
只能加在
或含
约束的整数列上,且一张表只能有一个
列。
常见错误现象:
。
写法必须是:
,不能分开写两行,也不能写成
(语法错)
如果已有主键但不是整数类型(比如
UUID),就别硬加
,它不生效
想从某个数开始自增?建表后立刻执行:
ENGINE 和 CHARSET 不写就会掉进默认陷阱
不显式指定
和
,MySQL 会按版本和配置取默认值:5.7 默认
,8.0 还是
,但字符集可能为
(尤其老实例),导致中文存成问号。
MySQL(Linux)
MySQL 9.6.0是面向Linux平台的2026年创新版本,核心架构迎来重大革新。其将外键约束与级联操作从InnoDB引擎层上移至SQL层,确保所有数据变更均被完整记录至Binlog,彻底解决了CDC(变更数据捕获)与主从复制中的数据不一致难题。此外,该版本引入container_aware启动选项以原生适配容器环境,并对审计日志进行了组件化重构,为追求极致数据一致性与云原生体验的开发者提供了全新选择。
下载
常见错误现象:插入中文显示
,或查询时
查不到,但
能命中——大概率是字符集/排序规则不一致。
建表务必带上:
(MySQL 8.0)或
(5.7)
是真正支持 4 字节 Unicode(如 emoji、生僻汉字)的字符集;
在 MySQL 里只是伪 utf8,最多存 3 字节
如果表已建但字符集不对,改库改表改列三步缺一不可:
→
外键约束不是默认开启的,而且有存储引擎限制
只有
支持外键;
表加
语法能过,但实际不生效,也不报错——这是最隐蔽的坑。
常见错误现象:删父表记录时子表没级联删除,或插入子表时提示
,但检查发现父表明明有那条数据——多半是字段类型不严格一致(比如一个是
,一个是
),或字符集不同。
外键列和被引用列必须类型完全一致(含符号、长度)、索引类型一致(都要有索引)、字符集和排序规则也得一样
定义外键时建议显式写
或
,否则默认是
,容易卡住业务逻辑
线上环境慎用外键:它会让删除/更新变慢,还可能引发死锁;很多团队选择在应用层做一致性校验
最常被忽略的是字符集与存储引擎的组合效应——建表语句看着全,但只要漏了
或
,后续所有文本操作都可能出哑巴错。另外,
和主键绑定之紧,远超多数人直觉,不要试图绕开它另搞一套“逻辑主键”。
CREATE TABLEINTVARCHAR(255)DATETIMEERROR 1167 (HY000): The used storage engine can't index column 'xxx'TEXTPRIMARY KEYNOT NULLVARCHARVARCHARVARCHAR(100)VARCHARVARCHAR(191)TINYINT(1)TINYINT(1) DEFAULT 0DATETIME TIMESTAMPAUTO_INCREMENTPRIMARY KEYUNIQUEAUTO_INCREMENTERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a keyid INT PRIMARY KEY AUTO_INCREMENTid INT AUTO_INCREMENT, PRIMARY KEY(id)CHAR(36)AUTO_INCREMENTALTER TABLE tbl_name AUTO_INCREMENT = 1000ENGINECHARSETInnoDBInnoDBlatin1???WHERE name = '张三'LIKE '%张%'ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ciutf8mb4_unicode_ciutf8mb4utf8ALTER DATABASE db_name CHARACTER SET = utf8mb4ALTER TABLE tbl_name CONVERT TO CHARACTER SET utf8mb4ENGINE=InnoDBMyISAMFOREIGN KEYCannot add or update a child rowINTBIGINTON DELETE CASCADEON UPDATE CASCADERESTRICTENGINECHARSETAUTO_INCREMENT