我的profile_name
表格中有一个varbinary列accounts
。最初,我认为我的用户不会输入特殊字符,并且会保持简短和甜蜜。
但是,那是我可怕的错误。他们开始使用大量特殊字符保留长篇名称,这给我带来了麻烦。
现在,我将他们的选项限制在字母数字,下划线和连字符,并且应该是3到10个字符。换句话说,这个正则表达式:[\w-]{3,10}
现在任务艰难。
我已经有570个用户,我想更新他们的个人资料名称以符合上述规则。
我有一些准系统代码:
public NpMaintainance()
{
UTF8Encoder encode = new UTF8Encoder();
List<string> names = new List<string>();
using (con)
{
con.Open();
using (cmd)
{
cmd.Parameters.Clear();
cmd.Connection = con;
cmd.CommandText = "select profile_name from accounts";
using (dr = cmd.ExecuteReader())
{
names.Add((dr[0] as byte[]).ToUnicodeString(encode));
}
}
}
}
我只是代码,我没有尝试过,因为它是一个生产网站。现在names
包含配置文件名称,我将重新插入表中。并且为了解决我的问题,profile_name
是唯一的,因此没有两个名称应该相同。
我已经提供了所有细节,并希望得到答案!
我该怎么办?还有其他方式(仅使用sql?),或者如果没有,请以我现在的方式帮助我!
答案 0 :(得分:1)
更新:
这是MySQL版本,在Shay Anderson编写的cleanString function的帮助下,只需稍作修改即可接受数字字母。
IF ASCII(c) > 31 AND ASCII(c) < 127 THEN
replaced with
IF (ASCII(c) > 47 AND ASCII(c) < 57)
OR (ASCII(c) > 64 AND ASCII(c) < 91)
OR (ASCII(c) > 96 AND ASCII(c) < 122) THEN
基本思路是创建一个临时表,将profile_name转换为varchar,清理它并将其更新回帐户表。
-- for testing purposes create and populate test table
CREATE TABLE accounts(id INT, profile_name VARBINARY(8000));
INSERT INTO accounts(id, profile_name)
SELECT 1, CAST('User|%$&&/(/' AS BINARY);
-- check what's in there
SELECT id, profile_name, CAST(profile_name AS CHAR) FROM accounts;
CREATE TEMPORARY TABLE IF NOT EXISTS tmp_accounts AS (
SELECT id, profile_name, CAST(profile_name AS CHAR) AS 'converted_name'
FROM accounts
);
-- clean converted profile_name in temp table using function udf_cleanString
UPDATE tmp_accounts
SET converted_name = UDF_CLEANSTRING(converted_name);
/* do any other change necessary.... length etc.
when satisfied with changes in temp table update accounts table with new profile_name
*/
UPDATE accounts a
INNER JOIN tmp_accounts t ON t.id = a.id
SET a.profile_name = CAST(t.converted_name AS BINARY);
-- check what was done with profile_name after changes
SELECT id, profile_name, CAST(profile_name AS CHAR) FROM accounts;
-- DROP TABLE tmp_accounts
在SQL中,您可以尝试将varbinary(max)转换为nvarchar(max)类型(假设accountid是accounts表的主键)
SELECT accountid, profile_name, CONVERT(NVARCHAR(MAX),profile_name) as converted_name
INTO #tmpaccounts
FROM accounts
然后使用一些字符剥离功能,如How to strip all non-alphabetic characters from string in SQL Server?中的那个。它可能需要一些调整来允许连字符和下划线,但它不应该太难
UPDATE #tmpaccounts SET converted_name = [dbo].[RemoveNonAlphaCharacters](converted_name)
应该注意角色的限制,如果你有更长的个人资料名称然后修剪它们,希望不应该有很多。 (我有点怀疑未经许可更改个人资料名称或至少是帐户所有者的意识) 之后,您可以从#tmpaccounts更新帐户表。
UPDATE a
SET profile_name = CONVERT(VARBINARY(max), converted_name)
FROM accounts a
INNER JOIN #tmpaccounts t on t.accountid = a.accountid
当然不要在生产数据库上执行此操作,使用演示或培训DB。