有人可以在我的ASPX网页上添加文章。
例如,他们输入类似标题的内容:
Öçöçü
将其保存在数据库中:
Öçöçü
但是当我需要从数据库中读取它来为它创建一个url时,我就用这种格式阅读它:
Ococu
所以我发送给人们阅读这篇文章到这个网址:www.test.com/ococu
,Ococu
是查询字符串。
我需要使用标题Öçöçü
检索本文的内容,但我无法执行类似
SELECT * FROM Article WHERE Title = Ococu
(Ococu = querystring),因为它已作为Öçöçü
我该怎么做才能解决这个问题?我需要执行该查询,但这是不可能的,因为查询字符串不包含保存在数据库中的外来字符。
或者我应该在数据库中创建两个属性?一个用于Title
,另一个用于URL
?所以我可以在where claus中执行查询:WHERE URL = Ococu
我需要你的帮助。
答案 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。
答案 1 :(得分:0)
最好是DB中有2个单独的字段,一个用于标题,另一个用于URL。有时您会希望更改标题,但网址完好无损,因此现有链接不会被破坏。并且您可能不希望在您的网址中包含空格和其他特殊字符,因此您需要缩短和替换符号(就像您在问题中描述的那样)。
如果第三方在您的网站上创建文章,例如从url参数执行令人讨厌的脚本,这也可以减轻可能暴露的一些安全风险。