MariaDB中STR_TO_DATE转换德语日期返回NULL问题排查
问题原因及解决方法
核心原因
你的SQL转换失败返回NULL,主要是两个关键问题:
- 格式符不匹配:
STR_TO_DATE的%M格式符默认匹配英文全称月份(如January),但你的日期存储的是德语月份(如Januar),自然无法识别匹配。 - 会话语言环境限制:即使格式符正确,MySQL默认会话的
lc_time_names参数通常是英文(如en_US),不支持解析德语月份名称。
解决方法
方法1:设置德语会话语言后转换
先将当前MySQL会话的时间语言切换为德语,再用%M匹配德语月份全称:
-- 设置会话时间语言为德语 SET lc_time_names = 'de_DE'; -- 执行转换 SELECT datum, CAST(STR_TO_DATE(datum, '%d.%M.%Y') AS DATE) AS converted_date FROM esf WHERE ESF_ID = 44421;
如果你的日期里是德语月份缩写(如Jan),则把格式符换成%b即可。
方法2:手动替换德语月份为英文(无需修改会话设置)
如果无法修改会话参数,直接用REPLACE把德语月份替换成对应的英文,再进行转换:
SELECT datum, CAST(STR_TO_DATE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE( REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(REPLACE(datum, 'Januar', 'January'), 'Februar', 'February'), 'März', 'March'), 'April', 'April'), 'Mai', 'May'), 'Juni', 'June'), 'Juli', 'July'), 'August', 'August'), 'September', 'September'), 'Oktober', 'October'), 'November', 'November'), 'Dezember', 'December'), '%d.%M.%Y') AS DATE) AS converted_date FROM esf WHERE ESF_ID = 44421;
排查验证步骤
- 先查看测试条目的原始日期值:
SELECT datum FROM esf WHERE ESF_ID = 44421;,确认月份是全称还是缩写,是否存在多余空格/特殊字符。 - 检查当前会话语言:
SELECT @@lc_time_names;,如果返回en_US则说明语言环境不支持德语月份解析。
内容的提问来源于stack exchange,提问作者Stefan Bongers
相关产品推荐
相关产品推荐

