我昨天问了一个问题,关于将数据库从IBM819(单字节字符,Latin1子集)切换到UTF-8(多字节字符,unicode)编码,因为需要支持新的Czech个字符的文字输入。
我刚刚被一位nchar和nvarchar列类型的同事提醒过,我们都没有用过它们。
如果我要将相关列定义为nchar和nvarchar而不是char和varchar,那么我需要做些什么来允许我当前的IBM819数据库使用来自我的.net应用程序的这个新的IBM819不兼容文本?
所有转化都是自动的吗?
我是否需要编写一些可怕的转换代码?
这只是一个不可行的解决方案吗?我正在追逐彩虹?
编辑:是的,我定义了一个“nchartest”表,其中包含nchar(500)类型的单个列“ntest”。
我通过.net代码连接到该网址并确认可以输入500个lorem ipsum字符:
Dim insertString As String = "INSERT INTO nchartest VALUES (?)"
Dim insertCommand As New IfxCommand(insertString, cConnection, tTransaction)
insertCommand.Parameters.Add("incident_recno", IfxType.NChar).Value = "[lipsum]"
Return insertCommand.ExecuteNonQuery
然后我用100个左右的捷克文本字符替换了lipsum字符串,并试图插入导致.net Informix接口抛出IfxException,并显示消息ERROR [HY000] [Informix .NET provider]Unspecified System Error = -21005.
我昨天做了一些研究,我尝试将连接字符串中的CLIENT_LOCALE
设置设置为en_US
以匹配Threading.Thread.CurrentThread.CurrentUICulture
报告的设置,但无法打开该连接由于ERROR [HY000] [Informix .NET provider][Informix]Unable to load locale categories.
在此之后,我尝试设置CLIENT_LOCALE=en_US.unicode
,这会产生ERROR [HY000] [Informix .NET provider][Informix]Unspecified System Error = -31142.
现在我又难过了。
答案 0 :(得分:3)
NATIONAL CHARACTER(N [VAR] CHAR)被解释为UTF-16代码单元是特定于MS SQL Server的特征。 ANSI SQL标准没有指定该行为;其他数据库对NCHAR有不同的反应。
Informix使用它来决定是使用区域设置排序规则而不是代码单元排序规则,但它不会影响基础字符集,因此它不会对您有所帮助。
您仍然需要使用UTF-8语言环境,是的,如果您使用数据库已经有现有的终端应用程序,那么它们很可能无法使用处理Unicode。