将 UTF-8 数据插入 SQL Server 2012
Inserting UTF-8 data into SQL Server 2012
我有一个 SQL Server 2012 数据库,其中 table 包含 2 列 UTF-8 数据(非英语。具体来说是泰米尔语)。我为这些列设置的数据类型是 nvarchar(500)。我从 jsp 页面(输入类型为文本)获取输入(UTF-8 数据)。我可以将该文本框的值成功插入 sql 服务器,但是当我去查看该值时,它就像这样“...1;”我还确保在列值之前添加 N。这是代码:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = java.sql.DriverManager.getConnection(url, id, pass);
String addbks = "insert into something.dbo." + Table + " (ID, BookName, Author, Owner, OwnerEmpID, Status, Reservation, Genre, StatusID) values (NEXT VALUE FOR " + Seq + ", N'" + BookName + "', N'" + AuthorName + "', '" + Name + "', '" + user2 + "', 'Available', NULL, '" + Genre + "', '1')";
其中 BookName 和 AuthorName 是我们谈到的两列。我还将 BookName 和 AuthorName 转换为 UTF-8 格式 - 这是代码:
BookName = new String(BookName.getBytes("ISO-8859-1"),"UTF-8");
AuthorName = new String(AuthorName.getBytes("ISO-8859-1"),"UTF-8");
在Body标签下面,我还有以下内容:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
我仍然在数据库中得到特殊字符,而不是实际数据。我怎样才能做到这一点?
编辑:作为记录,如果我将数据直接插入 SQL 服务器,它工作得很好。这是查询:
select BookName, Author from tam_hist where bookname like N'%தமிழ்%'
结果:தண்ணீர்
所以在我们在评论部分闲聊之后,我了解到您的收藏需要在 table 中进行更改,这是执行此操作的潜在查询:
ALTER TABLE tam_hist
ALTER COLUMN bookname NVARCHAR(500) COLLATE Indic_General_90_BIN;
我正在按照 this site 上的建议使用此排序规则。
如果您 need/want 更改整个数据库的排序规则,而不是特定列,请阅读 this link。
这是您问题的基本复制:
DECLARE @Test TABLE ( bookName NVARCHAR(500) COLLATE Indic_General_90_BIN)
INSERT INTO @Test (bookName)
VALUES (N'தமிழ்')
SELECT *
FROM @Test
WHERE bookName LIKE N'%தமிழ்%'
对我来说,它 returns 预期的结果。也许您的 SQL 声明有问题?如我所见,您正在连接字符串以创建查询,也许使用 perpared statements 可以解决您的问题?
我有一个 SQL Server 2012 数据库,其中 table 包含 2 列 UTF-8 数据(非英语。具体来说是泰米尔语)。我为这些列设置的数据类型是 nvarchar(500)。我从 jsp 页面(输入类型为文本)获取输入(UTF-8 数据)。我可以将该文本框的值成功插入 sql 服务器,但是当我去查看该值时,它就像这样“...1;”我还确保在列值之前添加 N。这是代码:
Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
con = java.sql.DriverManager.getConnection(url, id, pass);
String addbks = "insert into something.dbo." + Table + " (ID, BookName, Author, Owner, OwnerEmpID, Status, Reservation, Genre, StatusID) values (NEXT VALUE FOR " + Seq + ", N'" + BookName + "', N'" + AuthorName + "', '" + Name + "', '" + user2 + "', 'Available', NULL, '" + Genre + "', '1')";
其中 BookName 和 AuthorName 是我们谈到的两列。我还将 BookName 和 AuthorName 转换为 UTF-8 格式 - 这是代码:
BookName = new String(BookName.getBytes("ISO-8859-1"),"UTF-8");
AuthorName = new String(AuthorName.getBytes("ISO-8859-1"),"UTF-8");
在Body标签下面,我还有以下内容:
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%>
我仍然在数据库中得到特殊字符,而不是实际数据。我怎样才能做到这一点?
编辑:作为记录,如果我将数据直接插入 SQL 服务器,它工作得很好。这是查询:
select BookName, Author from tam_hist where bookname like N'%தமிழ்%'
结果:தண்ணீர்
所以在我们在评论部分闲聊之后,我了解到您的收藏需要在 table 中进行更改,这是执行此操作的潜在查询:
ALTER TABLE tam_hist
ALTER COLUMN bookname NVARCHAR(500) COLLATE Indic_General_90_BIN;
我正在按照 this site 上的建议使用此排序规则。
如果您 need/want 更改整个数据库的排序规则,而不是特定列,请阅读 this link。
这是您问题的基本复制:
DECLARE @Test TABLE ( bookName NVARCHAR(500) COLLATE Indic_General_90_BIN)
INSERT INTO @Test (bookName)
VALUES (N'தமிழ்')
SELECT *
FROM @Test
WHERE bookName LIKE N'%தமிழ்%'
对我来说,它 returns 预期的结果。也许您的 SQL 声明有问题?如我所见,您正在连接字符串以创建查询,也许使用 perpared statements 可以解决您的问题?