Dapper不直接支持MySQL UNSIGNED类型映射,需在C#实体中显式使用对应无符号类型(如uint、ushort、ulong),并配合MySqlConnector驱动才能正确处理;错误使用int等有符号类型会导致溢出或截断。

Dapper 本身不直接支持 MySQL 的 UNSIGNED 类型映射,因为 .NET 基础类型(如 int、long)默认是有符号的,而 MySQL 的 INT UNSIGNED 实际上对应的是无符号整数范围(0 到 4294967295),超出 int 最大值(2147483647)时会溢出或报错。
MySQL UNSIGNED 到 .NET 类型的合理映射
关键不是“Dapper 能不能自动识别”,而是你如何在 C# 端用合适的类型承接无符号值:
-
TINYINT UNSIGNED→byte(0–255)或ushort(更安全,避免隐式转换问题) -
SMALLINT UNSIGNED→ushort(0–65535) -
INT UNSIGNED→uint(0–4294967295)——这是最常见也最需注意的,int会截断高位 -
BIGINT UNSIGNED→ulong(0–18446744073709551615)
实体类中必须显式使用无符号类型
Dapper 是基于属性名和数据库列名(或别名)做反射映射的,它不会解析 MySQL 的列类型元数据。所以你必须在 C# 实体中用正确的无符号类型声明字段:
public class User
{
public uint Id { get; set; } // 对应 INT UNSIGNED `id`
public ushort Status { get; set; } // 对应 SMALLINT UNSIGNED `status`
public ulong Version { get; set; } // 对应 BIGINT UNSIGNED `version`
}如果错误地写成 int Id,当数据库值 > 2147483647 时,Dapper 仍会尝试赋值,但运行时可能抛 OverflowException(取决于连接字符串是否开启 Allow User Variables=true 和驱动行为),或静默截断(不推荐)。
确保 MySqlConnector 驱动正确返回无符号值
使用官方推荐的 MySqlConnector(非 Oracle 的 MySql.Data),它默认将 INT UNSIGNED 映射为 UInt32,能与 C# 的 uint 自然匹配。检查你的连接字符串和 NuGet 包:
- 安装包:
MySqlConnector(≥2.2.0) - 连接字符串无需特殊配置,但建议加上
Allow User Variables=True(兼容性更好) - 避免混用
MySql.Data,它对无符号类型支持较弱,常强制转为有符号或long
查询时可加 CAST 或别名辅助(备用方案)
极少数场景(如动态 SQL、视图、旧表无法改实体),可用 SQL 层转换规避映射问题:
SELECT CAST(id AS SIGNED) AS id, -- 强制转有符号(仅当确认值 ≤ 2147483647) status, version FROM users
或更稳妥地用别名配合 Dapper 的列名映射:
SELECT id AS Id, status AS Status FROM users
只要实体属性名匹配别名,Dapper 就能绑定——但本质仍是靠类型声明,不是靠别名改变底层类型。
基本上就这些。核心是:驱动选对 + 实体类型写对 + 不依赖 Dapper 自动推断。无符号映射不是 Dapper 的短板,而是需要开发者明确语义的设计选择。










