MySQL布尔查询结果类型从long变ulong的版本差异原因咨询
类型映射变化的原因分析
这个问题的核心是MySQL Connector/NET(C#驱动)与MySQL服务器在8.0.16到8.0.27版本间,对布尔比较表达式返回值的类型映射逻辑发生了调整,具体拆解为两点:
- 首先,MySQL中
field = 1这类比较表达式的返回值本质是TINYINT(1)类型,但在8.0.27版本的服务器中,该表达式返回字段的元数据被标记为无符号(UNSIGNED),而8.0.16版本中是有符号(SIGNED)。 - 其次,Connector/NET的类型映射规则在对应版本中做了修正:
- 8.0.16及更早版本的驱动,会忽略
TINYINT(1)的符号属性,统一映射为.NET的long(Int64,有符号64位整数); - 8.0.27版本的驱动则严格遵循字段的符号标记,当
TINYINT(1)被标记为无符号时,会映射为.NET的ulong(UInt64,无符号64位整数)。
- 8.0.16及更早版本的驱动,会忽略
另外补充:如果代码中没有显式设置TreatTinyAsBoolean配置项,部分驱动版本中该配置的默认值变化也可能间接影响这个映射——当TreatTinyAsBoolean为false时,驱动会将TINYINT(1)当作纯整数处理,这时候符号属性的影响就会直接体现出来。
内容的提问来源于stack exchange,提问作者imukai
相关产品推荐
相关产品推荐

