PDO执行MySQL建表SQL报SQLSTATE[42000] 1064语法错误如何排查
问题根因
这个1064语法错误和PDO迁移无关,是你写的建表SQL本身存在语法问题:所有字符串字段的定义都漏写了字段类型VARCHAR。
MySQL的字段定义规则是字段名 字段类型(长度) 属性,你现在写的name(255) NOT NULL这类写法,MySQL无法识别name是合法的字段类型,会直接抛出语法错误。之前原生MySQL扩展能正常运行,基本是迁移过程中手误删掉了类型关键字,不是PDO扩展本身的兼容问题。
修正后的代码
将up方法内的SQL补全所有缺失的VARCHAR类型即可:
public function up() { $db = Application::$app->database; $sql = "CREATE TABLE users ( id INT AUTO_INCREMENT PRIMARY KEY, name VARCHAR(255) NOT NULL, first_name VARCHAR(255) NOT NULL, last_name VARCHAR(255) NOT NULL, email VARCHAR(255) NOT NULL, password VARCHAR(255) NOT NULL, status TINYINT NOT NULL, created_at TIMESTAMP DEFAULT CURRENT_TIMESTAMP ) ENGINE=INNODB;"; $db->pdo->exec($sql); }
后续排查同类问题的建议
- 遇到MySQL 1064错误优先检查SQL本身语法,PDO只会将你写的SQL原样发送给MySQL执行,不会自动修改SQL内容,不要先把排查方向放在扩展兼容性上。
- 排查时可以把待执行的SQL单独复制到MySQL客户端执行,客户端会直接标出语法错误的精确位置,比零散的堆栈跟踪定位效率高很多。
- 写建表语句时注意,只有字段类型支持长度参数时才能跟括号,字符串类型必须明确指定
VARCHAR/CHAR/TEXT等类型,不能直接在字段名后加长度括号。
内容的提问来源于stack exchange,提问作者Mahmoud Khosravi
相关产品推荐
相关产品推荐

