【问题标题】:Inserting UTF-8 data into SQL Server 2012将 UTF-8 数据插入 SQL Server 2012
【发布时间】:2015-08-09 06:38:50
【问题描述】:

我有一个 SQL Server 2012 数据库,其中一个表包含 2 列 UTF-8 数据(非英语。具体为泰米尔语)。我为这些列设置的数据类型是 nvarchar(500)。我从 jsp 页面(输入类型为文本)获取输入(UTF-8 数据)。我可以成功地将那个文本框的值插入到sql server中,但是当我去查看值时,它是这样的“...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 Server 中插入数据,它工作得很好。这是查询:

select BookName, Author from tam_hist where bookname like N'%தமிழ்%'

结果:தண்ணீர்

【问题讨论】:

  • 您是否检查过您的 SQL Server 使用的排序规则? msdn.microsoft.com/en-us/library/ms144250%28v=sql.105%29.aspx
  • 如何检查我的 SQL Server 使用的是哪个排序规则?有什么疑问吗?
  • 我使用了这个查询并在我的数据库中找到了 75 行。 SELECT * FROM sys.fn_helpcollat​​ions() WHERE name LIKE 'SQL%';
  • 您可以使用以下查询检查您的排序规则:SELECT CONVERT (varchar, SERVERPROPERTY('collation'));
  • 这是输出:SQL_Latin1_General_CP1_CI_AS

标签: javascript sql-server utf-8


【解决方案1】:

因此,在我们在评论部分进行了简短的交谈后,我了解到您的表中的排序规则需要更改,这是潜在的查询:

ALTER TABLE tam_hist
ALTER COLUMN bookname NVARCHAR(500) COLLATE Indic_General_90_BIN;

我正在使用this site 上建议的这种排序规则。

如果您需要/想要更改整个数据库的排序规则,而不是特定列,请阅读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'%தமிழ்%'

对我来说,它会返回预期的结果。也许您的 SQL 语句有问题?正如我所见,您正在连接字符串以创建查询,也许使用 perpared statements 可以解决您的问题?

【讨论】:

  • 不,我仍然得到特殊字符...(如 .......;)现在,当我在帖子中粘贴确切的特殊字符时(我会编辑问题),它会更改为我想要的结果。这里是:தண்ணீர்同样,当我在 jsp 页面中获取这些特殊字符时,它显示得很好。但仅在 DB 中,我将它们视为特殊字符。
  • 嘿 - 我已经编辑了我的答案。我唯一的想法可能是您的文本在插入 Java 客户端期间被翻译成十六进制字符?
  • 是的,看起来好像文本被翻译成十六进制字符时发生了一些事情。我刚刚更新了查询以直接包含该值,而不是从文本框中包含该值,它工作正常。如何在我的 jsp 页面中隔离十六进制字符转换?顺便说一句,这是有效的查询。 String addbks = "插入到 something.dbo." + 表 + " (ID, BookName, Author, Owner, OwnerEmpID, Status, Reservation, Genre, StatusID) 值 (NEXT VALUE FOR " + Seq + ", N'பொன்னியின் செல்வன்', N'செல்வன்', "', '" + user2 + "', 'Available', NULL, '" + Genre + "', '1')";
  • 很遗憾,我无法回答。知识不够。
  • 自己找到了答案!输入后我重新定向到新页面,并且只对新页面进行编码。刚刚在输入页面上添加了编码,这解决了这个问题。非常感谢您的帮助 Evaldas!
猜你喜欢
  • 1970-01-01
  • 2023-03-04
  • 1970-01-01
  • 2012-02-18
  • 1970-01-01
  • 2017-06-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多