【问题标题】:Why is the length of a string returned by SQL different from that returned by other languages?为什么 SQL 返回的字符串长度与其他语言返回的字符串长度不同?
【发布时间】:2015-04-01 20:09:34
【问题描述】:

我有一个用户用来发送消息的网络应用程序。

问题是消息中的字符数 确定发送消息的成本。

我注意到 javascript UI 代码计算了 字符很好,但 DBMS 的内置函数 有时会返回更多的字符。

这里是一个字符串的例子,它展示了这个异常 行为:

String with different lengths..
This string has different lengths depending on the programming language use to count the characters.

Transact SQL LEN() and MySQL LENGTH() return 217.

Python len() returns 212.

Javascript 和 Python 中的标准字符串长度函数返回相似的值,但低于 Transact-SQL 的 LEN() 和 DATALENGTH() 以及 MySQL 的 LENGTH() 返回的值(它们也返回彼此相似的值)。

那么为什么会有不同的值呢?

【问题讨论】:

  • 这些是 UTF8 字符串吗?计数可能取决于是计算原始字符还是编码字符。
  • @tdelaney,也许吧。我想知道排序规则是否会导致这种情况,但我想不出一种方法来测试它。

标签: javascript python mysql sql-server


【解决方案1】:

我无法与 MySQL 交谈。对于 SQL Server:

LEN() 函数告诉您字符串中有多少个字符,不包括尾随空格。 DATALENGTH() 告诉您给定字符串占用了多少空间。对于 varchar 数据类型,这将是每个字符 1 个字节。对于 nvarchar 数据类型,它是每个字符两个字节。请注意,它在使用 DATALENGTH() 时会计算空白。下面是一些示例,展示了使用不同字符串和数据类型的两个函数

select 
    LenTrailingSpace = len(' abc '),
    LenNoTrailingSpace = len(' abc'),
    DatalengthTrailingSpace = datalength(' abc '),
    DatalengthNoTrailingSpace = datalength(' abc'),
    UnicodeDatalengthTrailingSpace = datalength(N' abc '),
    UnicodeDatalengthNoTrailingSpace = datalength(N' abc')

【讨论】:

  • 但在我的情况下 LEN() 和 DATALENGTH() 都返回相同的值。我只是想排除对空格的任何修剪。
【解决方案2】:

我注意到只有当字符串中有换行符时才会发生这种情况。

SQL 服务器将 '\r\n' 计为两个字符。

我的解决方案是使用类似的方法计算字符数

LEN(REPLACE(the_string, CHAR(13), ''))

在计算字符串长度之前去掉回车。

stackoverflow entry 和 one 对我帮助很大。

【讨论】:

    猜你喜欢
    • 2016-05-12
    • 2019-04-18
    • 2013-05-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多