带外来字符的URL和标题

时间:2013-12-25 21:19:46

标签: c# mysql asp.net database slug

有人可以在我的ASPX网页上添加文章。

例如,他们输入类似标题的内容:

Öçöçü

将其保存在数据库中:

Öçöçü

但是当我需要从数据库中读取它来为它创建一个url时,我就用这种格式阅读它:

Ococu

所以我发送给人们阅读这篇文章到这个网址:www.test.com/ococuOcocu是查询字符串。

我需要使用标题Öçöçü检索本文的内容,但我无法执行类似

的操作

SELECT * FROM Article WHERE Title = Ococu(Ococu = querystring),因为它已作为Öçöçü

保存到数据库中

我该怎么做才能解决这个问题?我需要执行该查询,但这是不可能的,因为查询字符串不包含保存在数据库中的外来字符。

或者我应该在数据库中创建两个属性?一个用于Title,另一个用于URL?所以我可以在where claus中执行查询:WHERE URL = Ococu

我需要你的帮助。

2 个答案:

答案 0 :(得分:1)

如果不知道在MySQL表中声明列的方式以及如何存储实体(字符),很难说明如何解决这个问题。如果您的列声明如下:

,这种跨国内容最容易处理
  Title VARCHAR(50) CHARACTER SET utf8 COLLATE utf8_turkish_ci

这允许表格包含您的土耳其字符(以及希腊语和匈牙利语),而不必进行实体编码(ü等)。

如果您的表实际上是以这种方式编码的,请尝试以下SELECT语句:

 SELECT * 
   FROM Article
  WHERE Title = 'ococu' 
COLLATE utf8_general_ci

对土耳其人一无所知,我不知道原因,但很明显,土耳其整理将ö视为与o不同的字母,同样适用于çcüu。但是,utf_general_ci排序规则将这些字母视为相同。这就是上面的SELECT语句有效的原因。

如果表格中的数据存储了实体编码(ü等),您真的应该将其翻译为utf8,以便您可以使用此类搜索。

最后,您提到的值为ococu的网址片段在交易中通常称为 slug 。您的标题Öçöçü需要转换为slug值才能进行搜索。我上面的建议采用整理来做到这一点。值得一提的是,内容管理系统通常将文章的标题和slug存储在数据库表的不同列中。这允许在创建文章时明确地创建标题中的slug。

这是一个Stack Overflow项目,解释了如何使用C#将unicode短语转换为slug。

URL Slugify algorithm in C#?

答案 1 :(得分:0)

最好是DB中有2个单独的字段,一个用于标题,另一个用于URL。有时您会希望更改标题,但网址完好无损,因此现有链接不会被破坏。并且您可能不希望在您的网址中包含空格和其他特殊字符,因此您需要缩短和替换符号(就像您在问题中描述的那样)。

如果第三方在您的网站上创建文章,例如从url参数执行令人讨厌的脚本,这也可以减轻可能暴露的一些安全风险。