如何将VARCHAR转换为NVARCHAR mysql?

时间:2017-06-19 15:08:41

标签: mysql database utf-8

说我有:

    ID                      Title
 ------------------------------------------------------
|   1   |                   ماهر زين                   |
 ------------------------------------------------------

目前,其数据类型设置为VARCHAR(255),其中collat​​ion = utf8-default collation

根据我的研究,我发现你必须拥有数据类型设置为NVARCHAR的Table列才能存储unicode或arabic字符。所以我尝试将列的数据类型更改为NVARCHAR但是它会出现此错误:

查询:

ALTER TABLE `db`.`table` 
CHANGE COLUMN `NAME` `NAME` NVARCHAR(255) CHARACTER SET 'utf8' NULL DEFAULT NULL ;

错误:

  

操作失败:将SQL脚本应用于数据库时出错。   执行:   ALTER TABLE dbtable   CHANGE COLUMN NAME NAME NVARCHAR(255)CHARACTER SET'utf8'NULL DEFAULT NULL;

     

错误1064:您的SQL语法出错;查看与MySQL服务器版本对应的手册,以便在第2行'CHARACTER SET'utf8'NULL DEFAULT NULL'附近使用正确的语法   SQL语句:   ALTER TABLE dbtable   CHANGE COLUMN NAME NAME NVARCHAR(255)CHARACTER SET'utf8'NULL DEFAULT NULL

仅供参考:我正在手动使用MySql工作台进行此转换。

2 个答案:

答案 0 :(得分:2)

此处不需要NVARCHAR,因为Mysql可以使用VARCHAR处理Unicode。 (实际上,NVARCHAR只有VARCHAR预设utf8字符集 - 请参阅https://dev.mysql.com/doc/refman/5.7/en/charset-national.html

也许你把它与MSSQL混淆了?

答案 1 :(得分:1)

我看到你们的3个问题,似乎都归结为阿拉伯语变成了“问号”。在http://stackoverflow.com/questions/38363566/trouble-with-utf8-characters-what-i-see-is-not-what-i-stored中搜索该内容。它讨论了可能的原因。

但是,你已经尝试了一些ALTER - 这些可能会使事情更糟。所以让我们做一些诊断。按照“测试数据”下的链接中的说明进行SELECT HEX(...)。 'ماهر'的十六进制,如果正确存储为utf8,则应显示为D985 D8A7 D987 D8B1。如果你看到任何不同的东西,问题会变得更加混乱。

如果涉及latin1,

3F3F3F3F(4个问号的十六进制)就是你得到的。 C399E280A6C398C2A7C399E280A1C398C2B1将是“双重编码”。

无论如何,问号的可能原因是

  • 要存储的字节不编码为utf8 / utf8mb4。解决这个问题。 - 将Java中的阿拉伯文本转储到HEX中。
  • 数据库中的列是CHARACTER SET utf8(或utf8mb4)。解决这个问题。 - 请提供SHOW CREATE TABLE进行验证。
  • 另外,检查读取期间的连接是否为UTF-8。 - 从理论上讲,你通过&useUnicode=yes&characterEncoding=UTF-8处理了这个问题。