说我有:
ID Title
------------------------------------------------------
| 1 | ماهر زين |
------------------------------------------------------
目前,其数据类型设置为VARCHAR(255)
,其中collation = 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
db
。table
CHANGE COLUMNNAME
NAME
NVARCHAR(255)CHARACTER SET'utf8'NULL DEFAULT NULL;错误1064:您的SQL语法出错;查看与MySQL服务器版本对应的手册,以便在第2行'CHARACTER SET'utf8'NULL DEFAULT NULL'附近使用正确的语法 SQL语句: ALTER TABLE
db
。table
CHANGE COLUMNNAME
NAME
NVARCHAR(255)CHARACTER SET'utf8'NULL DEFAULT NULL
仅供参考:我正在手动使用MySql工作台进行此转换。
答案 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
。如果你看到任何不同的东西,问题会变得更加混乱。
3F3F3F3F
(4个问号的十六进制)就是你得到的。 C399E280A6C398C2A7C399E280A1C398C2B1
将是“双重编码”。
无论如何,问号的可能原因是
SHOW CREATE TABLE
进行验证。&useUnicode=yes&characterEncoding=UTF-8
处理了这个问题。