当值与字符串相互转换时,SQL Server 是否考虑文化/区域设置?

发布于 2024-07-17 04:50:12 字数 780 浏览 7 评论 0原文

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

我的问题是:生成 SQL 查询时,我应该使用不变区域性、SQL 服务器区域性还是什么来格式化数字等? 也就是说,如果我的计算机设置为德语(德国),那么以下哪个查询是正确的?

select foo from bar where baz = 123.45

或者

select foo from bar where baz = 123,45

同样,如果我使用 SQL 的 CAST 将浮点值转换为字符串,SQL 将使用什么区域设置进行转换?

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

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

I'm attempting to update a large codebase to properly specify the CultureInfo and/or IFormatProvider when formatting/parsing values. For instance, when parsing a value I get from the user, I pass CultureInfo.CurrentCulture when calling TryParse, and when converting a float to a string for persistence, I pass CultureInfo.InvariantCulture when calling ToString.

My question is this: when generating SQL queries, should I format numbers and the like using the invariant culture, or the SQL server's culture, or what? Which is to say, if my computer is set to German (Germany), which of these queries is right?

select foo from bar where baz = 123.45

or

select foo from bar where baz = 123,45

Likewise, if I use SQL's CAST to convert a floating-point value to a string, what locale is SQL going to use for the conversion?

I did search the SQL docs, but so far I can't find any good answers. I did find some info about date formatting (SET DATEFORMAT and the like), but that's it.

NOTE: I realize that the preferred way to pass inputs to a SQL query is via parameters, so let's assume for argument's sake that I have a good reason to format them into the query string. Also, handing query inputs is only part of the broader question.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

情绪操控生活 2024-07-24 04:50:12

它会抛出一个错误。 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 (DE)
  • 1'234,56 (CH)
  • 1,234.56 (EN-GB)

It will throw an error. The language of SQL Server only affects date/time values.

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

I'm in Switzerland and have to deal with all 3 of these...

  • 1.234,56 (DE)
  • 1'234,56 (CH)
  • 1,234.56 (EN-GB)
~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文