字符串长度与数据库字符串长度不一样

2019-08-01 10:36:50 +08:00
 liuguichao
实例字符串:
/?o=AQN1tEJoAu3I3x81LgpKQ68cF161Yo_ylAOPmcHArnV9Bv3eduqzWDlvw1Iswdm--9lGxRMfK4lNkUU5Sp89CnakOHi07_Us3NfsTC3aMz8VzDk7-TFa_X0v6RS0aoFIHLrCZAhe1XbWMB43XK_9yw&v=5&e=1564578707&t=LjvCaWwl_RTE-igu6cSfAxVA1O8#sc=Eq4$6r\x10\x0bf@_\x07BS\x05\x00GHrH@@{\x7f\x02^Va\x05\x13R\x0exyK)\x1br\x00

使用 python 内置的 len,返回长度是 244
使用 sql server 的 len 和 datalength,返回长度是 280,
假设我的数据库字段长度是 nvarchar(250), python 里面判断字符串不需要截断,但是插入数据库会失败。用 python 能怎么准确的算出与数据库一致的长度?
2146 次点击
所在节点    Python
3 条回复
xpresslink
2019-08-01 11:08:37 +08:00
>>> len(r'/?o=AQN1tEJoAu3I3x81LgpKQ68cF161Yo_ylAOPmcHArnV9Bv3eduqzWDlvw1Iswdm--9lGxRMfK4lNkUU5Sp89CnakOHi07_Us3NfsTC3aMz8VzDk7-TFa_X0v6RS0aoFIHLrCZAhe1XbWMB43XK_9yw&v=5&e=1564578707&t=LjvCaWwl_RTE-igu6cSfAxVA1O8#sc=Eq4$6r\x10\x0bf@_\x07BS\x05\x00GHrH@@{\x7f\x02^Va\x05\x13R\x0exyK)\x1br\x00')
280
liuguichao
2019-08-01 13:37:56 +08:00
@xpresslink 多谢!
总结一下:
使用 s.encode('string_escape')和 s.encode('unicode-escape'),可以获取 raw string,再取 len 就可以获得期望的字节长度。
需要注意的事项: 数据库中的 char(n)/varchar(n)/nchar(n)/nvarchar(n), n 指的是字符串的字节码表示长度,不是字符串的长度。
peanuts7660
2019-08-01 13:40:40 +08:00
>>> len(r"/?o=AQN1tEJoAu3I3x81LgpKQ68cF161Yo_ylAOPmcHArnV9Bv3eduqzWDlvw1Iswdm--9lGxRMfK4lNkUU5Sp89CnakOHi07_Us3NfsTC3aMz8VzDk7-TFa_X0v6RS0aoFIHLrCZAhe1XbWMB43XK_9yw&v=5&e=1564578707&t=LjvCaWwl_RTE-igu6cSfAxVA1O8#sc=Eq4$6r\x10\x0bf@_\x07BS\x05\x00GHrH@@{\x7f\x02^Va\x05\x13R\x0exyK)\x1br\x00")
280
>>> len("/?o=AQN1tEJoAu3I3x81LgpKQ68cF161Yo_ylAOPmcHArnV9Bv3eduqzWDlvw1Iswdm--9lGxRMfK4lNkUU5Sp89CnakOHi07_Us3NfsTC3aMz8VzDk7-TFa_X0v6RS0aoFIHLrCZAhe1XbWMB43XK_9yw&v=5&e=1564578707&t=LjvCaWwl_RTE-igu6cSfAxVA1O8#sc=Eq4$6r\x10\x0bf@_\x07BS\x05\x00GHrH@@{\x7f\x02^Va\x05\x13R\x0exyK)\x1br\x00")
244

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/588106

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX