SQL Server 在将值转换为字符串/从字符串转换时是不是考虑文化/区域设置?

Posted

技术标签:

【中文标题】SQL Server 在将值转换为字符串/从字符串转换时是不是考虑文化/区域设置?【英文标题】:does SQL Server consider culture/locale when converting values to/from strings?SQL Server 在将值转换为字符串/从字符串转换时是否考虑文化/区域设置? 【发布时间】:2009-04-13 22:39:50 【问题描述】:

我正在尝试更新大型代码库以在格式化/解析值时正确指定 CultureInfo 和/或 IFormatProvider。例如,在解析从用户那里获得的值时,我在调用TryParse 时传递CultureInfo.CurrentCulture,当将浮点数转换为字符串以进行持久化时,我在调用ToString 时传递CultureInfo.InvariantCulture

我的问题是:在生成 SQL 查询时,我应该使用不变的文化或 SQL 服务器的文化来格式化数字等吗?也就是说,如果我的电脑设置为 German(德国),这些查询哪个是对的?

select foo from bar where baz = 123.45

select foo from bar where baz = 123,45

同样,如果我使用 SQL 的 CAST 将浮点值转换为字符串,SQL 将使用什么语言环境进行转换?

我确实搜索了 SQL 文档,但到目前为止我找不到任何好的答案。我确实找到了一些有关日期格式的信息(SET DATEFORMAT 等),但仅此而已。

注意:我意识到将输入传递给 SQL 查询的首选方式是通过参数,所以为了论证的缘故,我们假设我有充分的理由将它们格式化为查询字符串。此外,处理查询输入只是更广泛问题的一部分。

【问题讨论】:

可能有帮助:***.com/questions/353545/… 【参考方案1】:

它会抛出一个错误。 SQL Server 的语言只影响日期/时间值。

SET LANGUAGE Deutsch
SELECT 'true' WHERE 1 <> 123,45

--gives
Msg 102, Level 15, State 1, Line 2
Falsche Syntax in der Nähe von ','.
There is far too much ambiguity in number formats

SET LANGUAGE Deutsch
SELECT 'true' WHERE 1 <> 123.45
--gives true

我在瑞士,必须处理所有这 3 个问题...

1.234,56(德国) 1'234,56 (CH) 1,234.56 (EN-GB)

【讨论】:

以上是关于SQL Server 在将值转换为字符串/从字符串转换时是不是考虑文化/区域设置?的主要内容,如果未能解决你的问题,请参考以下文章

在字典中,将值从字符串转换为整数

strtotime 在将值用作硬编码字符串时不返回值

在 SQL Server 中读取 JSON 数据时无法从字符串转换为日期时间

为啥 SQL Server 在将 int 转换为数据类型 numeric 时抛出算术溢出错误?

将值从字符串转换为流时出错

使用 sql 将字符串纪元代码从 unix 时间戳转换为日期