MySQL插入MM/DD/YYYY日期报1292错误 无需改值修复方法
错误原因
MySQL的date类型默认仅识别YYYY-MM-DD格式的标准日期字符串,你插入的9/28/1989属于M/D/YYYY格式的美式日期,无法被默认解析规则识别,因此触发1292报错。
修复方案(无需手动修改日期值为默认格式)
方案1:插入时使用日期转换函数(推荐,无格式歧义)
你不需要手动调整每个日期的书写格式,只需要在INSERT语句中,用STR_TO_DATE()函数包裹原有日期值,指定匹配的格式规则即可自动完成合法日期转换。
针对你使用的月/日/4位年(月份、日期无前置零)的格式,对应的格式化规则为'%c/%e/%Y',修正后的可执行语句如下:
CREATE TABLE Patients ( Patient_ID integer PRIMARY KEY NOT NULL, L_Name varchar (10) NOT NULL, F_Name varchar (15) NOT NULL, Birthdate date NOT NULL, Telephone text (15) NOT NULL, Patient_Status Varchar (20) NOT NULL); -- 已修正原语句的语法错误、主键重复问题 INSERT INTO Patients VALUES ( '2116', 'Muhammed', 'Khalis', STR_TO_DATE('9/28/1989', '%c/%e/%Y'), '+1868-622-8322', 'Outpatient'); INSERT INTO Patients VALUES ( '2117', 'Gueverra', 'Leanna', STR_TO_DATE('1/24/2005', '%c/%e/%Y'), '+1868-321-4128', 'Outpatient'); INSERT INTO Patients VALUES ( '2118', 'Hunte', 'Riley', STR_TO_DATE('3/8/1944', '%c/%e/%Y'), '+1868-293-2782', 'Outpatient');
方案2:临时调整会话SQL模式(适合批量导入场景,不推荐生产环境使用)
如果不想修改每条插入语句,可以在执行插入前,临时关闭当前连接的严格SQL模式,让MySQL自动兼容非标准格式的日期值:
-- 关闭当前会话的严格模式 SET SESSION sql_mode = ''; -- 执行原有INSERT语句(需先修正原语句的语法、主键重复问题) INSERT INTO Patients VALUES ( '2116', 'Muhammed', 'Khalis', '9/28/1989', '+1868-622-8322', 'Outpatient'); INSERT INTO Patients VALUES ( '2117', 'Gueverra', 'Leanna', '1/24/2005', '+1868-321-4128', 'Outpatient'); INSERT INTO Patients VALUES ( '2118', 'Hunte', 'Riley', '3/8/1944', '+1868-293-2782', 'Outpatient'); -- 插入完成后恢复默认严格模式 SET SESSION sql_mode = DEFAULT;
注意:该方案存在日期解析歧义风险,例如
3/8/1944可能因区域设置被误解析为8月3日而非3月8日,数据准确性无法保证。
额外提示:你提供的原始SQL还存在两个会阻断执行的问题:
- 第三条INSERT语句末尾缺少分号,属于语法错误
Patient_ID是主键,不允许重复,原语句重复插入了ID为2117、2118的记录,会触发主键冲突错误
内容的提问来源于stack exchange,提问作者Hannah
相关产品推荐
相关产品推荐

