sql参数在多语种网站开发中的注意事项
- 作者:admin
- 最后更新:
- 来源:国尚网络
如题,当单语言的网站向多语言版本扩展时,会遇到unicode字符编码存储问题,以及伴随的sql查询问题。
以mssql为例。
在旧版本的数据库中,文字资料以varchar字段类型存储于表中。后来发现,当保存德语文字时时出现了一大堆问号。一番google后发现,存储时应该采用nvarchar字段存储。于是把所有相关的字段来了一次大改,统一改为nvarchar类型。
后续的验证排查过程中,发现个别地方始终是一堆问号。
在跟踪过程中发再如下代码有问题:
/// <summary>
/// 添加字符类型的参数。
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="paraValue">参数值</param>
public void AddParameter(string paraName, object paraValue)
{
CheckCommand();
SqlParameter para = this.cmd.CreateParameter();
para.ParameterName = paraName;
para.SqlDbType = SqlDbType.VarChar;
para.Value = Utility.isNullOrEmpty(paraValue) ? Convert.DBNull : paraValue.ToString();
this.cmd.Parameters.Add(para);
}
资料显示:
varchar:长度为 n 个字节的可变长度且非 Unicode 的字符数据。
nvarchar:包含 n 个字符的可变长度 Unicode 字符数据。
由此想到,在向SqlCommand传送参数时,varchar类型满足不了Unicode的字符集要求,于是正常的参数传过去后,就出现了一大堆“?”号。改为:
/// <summary>
/// 添加字符类型的参数。
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="paraValue">参数值</param>
public void AddParameter(string paraName, object paraValue)
{
CheckCommand();
SqlParameter para = this.cmd.CreateParameter();
para.ParameterName = paraName;
para.SqlDbType = SqlDbType.NVarChar;
para.Value = Utility.isNullOrEmpty(paraValue) ? Convert.DBNull : paraValue.ToString();
this.cmd.Parameters.Add(para);
}
再测试,数据提交成功了。
由此可见,网站语言版本的扩充,应当注意的除了网址的规划,数据库结构的规划。数据库查询操作代码层面上,也是有不少要注意的地方的。
济南国尚网络技术有限公司技术有限公司,是专注于济南地区的,专业从事济南网站建设(济南网站制作、济南建网站等)的互联网公司。
以mssql为例。
在旧版本的数据库中,文字资料以varchar字段类型存储于表中。后来发现,当保存德语文字时时出现了一大堆问号。一番google后发现,存储时应该采用nvarchar字段存储。于是把所有相关的字段来了一次大改,统一改为nvarchar类型。
后续的验证排查过程中,发现个别地方始终是一堆问号。
在跟踪过程中发再如下代码有问题:
/// <summary>
/// 添加字符类型的参数。
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="paraValue">参数值</param>
public void AddParameter(string paraName, object paraValue)
{
CheckCommand();
SqlParameter para = this.cmd.CreateParameter();
para.ParameterName = paraName;
para.SqlDbType = SqlDbType.VarChar;
para.Value = Utility.isNullOrEmpty(paraValue) ? Convert.DBNull : paraValue.ToString();
this.cmd.Parameters.Add(para);
}
资料显示:
varchar:长度为 n 个字节的可变长度且非 Unicode 的字符数据。
nvarchar:包含 n 个字符的可变长度 Unicode 字符数据。
由此想到,在向SqlCommand传送参数时,varchar类型满足不了Unicode的字符集要求,于是正常的参数传过去后,就出现了一大堆“?”号。改为:
/// <summary>
/// 添加字符类型的参数。
/// </summary>
/// <param name="paraName">参数名称</param>
/// <param name="paraValue">参数值</param>
public void AddParameter(string paraName, object paraValue)
{
CheckCommand();
SqlParameter para = this.cmd.CreateParameter();
para.ParameterName = paraName;
para.SqlDbType = SqlDbType.NVarChar;
para.Value = Utility.isNullOrEmpty(paraValue) ? Convert.DBNull : paraValue.ToString();
this.cmd.Parameters.Add(para);
}
再测试,数据提交成功了。
由此可见,网站语言版本的扩充,应当注意的除了网址的规划,数据库结构的规划。数据库查询操作代码层面上,也是有不少要注意的地方的。
济南国尚网络技术有限公司技术有限公司,是专注于济南地区的,专业从事济南网站建设(济南网站制作、济南建网站等)的互联网公司。