我无法在MySQL中创建NVARCHAR
数据类型。
我有以下疑问:
CREATE TABLE table1 ( column1 NVARCHAR(10) );
这将创建存储数据类型NVARCHAR(10)
的column1
。但是这个问题-
DESCRIBE table1;
给了我输出-
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column1 | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
因此,创建了可以存储NVARCHAR(10)
数据类型的column1,而不是可以存储VARCHAR(10)
数据类型的column1。
现在,假定只有NVARCHAR
数据类型存储非拉丁字符。
但是这个问题-
INSERT INTO table1 VALUES ("भारत");
成功运行,没有任何错误。这里的"भारत“是一个印地语单词,它在英语中听起来像”巴拉特“,翻译过来就是”印度“。
该查询-
SELECT * FROM table1;
如预期的那样显示-
+--------------+
| column1 |
+--------------+
| भारत |
+--------------+
我猜可能是MySQL在内部将VARCHAR
视为NVARCHAR
。但我找不到任何说明这一点的文件。
以下是来自MySQL开发人员网站的链接-
https://dev.mysql.com/doc/refman/8.0/en/charset-national.html
这里说NVARCHAR
是完全受支持的。
为了找出非拉丁字符是否可以存储在定义为VARCHAR
的列中,我运行了以下查询:
CREATE TABLE table2 ( column2 VARCHAR(10) );
DESCRIBE table2;
这给了我的输出-
+---------+-------------+------+-----+---------+-------+
| Field | Type | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | varchar(10) | YES | | NULL | |
+---------+-------------+------+-----+---------+-------+
在这里,可以存储VARCHAR(10)
数据类型的column2如期创建。
运行查询-
INSERT INTO table2 VALUES ("भारत");
运行时没有任何错误。
而这个查询-
SELECT * FROM table2;
给出预期的输出-
+--------------+
| column2 |
+--------------+
| भारत |
+--------------+
因此,即使我将column2声明为VARCHAR(10)
,我也可以成功地存储非拉丁字符(这里是印地语的梵文字符)。
最合理的结论是,无论将列声明为VARCHAR
还是NVARCHAR
,MySQL始终在内部将其存储为NVARCHAR
。但我找不到任何与此相关的文档。
下面的堆栈溢出问题最接近我的问题-
Issue Converting varchar to nvarchar mysql
但这个问题并没有得到答案。
我使用的是操作系统Ubuntu20.04和MySQL版本- 8.0.26
发布于 2021-08-21 17:01:22
养成使用SHOW CREATE TABLE
而不是DESCRIBE
的习惯。它会回答你的问题。
mysql> CREATE TABLE nv ( column1 NVARCHAR(10) );
Query OK, 0 rows affected, 1 warning (0.05 sec)
mysql> show warnings;
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Level | Code | Message |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
| Warning | 3720 | NATIONAL/NCHAR/NVARCHAR implies the character set UTF8MB3, which will be replaced by UTF8MB4 in a future release. Please consider using CHAR(x) CHARACTER SET UTF8MB4 in order to be unambiguous. |
+---------+------+---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SHOW CREATE TABLE nv\G
*************************** 1. row ***************************
Table: nv
Create Table: CREATE TABLE `nv` (
`column1` varchar(10) CHARACTER SET utf8 COLLATE utf8_general_ci DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_unicode_520_ci
1 row in set (0.00 sec)
警告提示您一个重要的问题,如果您尝试在列中存储中文或Emoji。需要utf8mb4
。
所以,你应该说
CREATE TABLE nv ( column1 VARCHAR(10) CHARACTER SET utf8mb4 );
也就是说,不要使用NVARCHAR,而要使用VARCHAR并指定适当的字符集。
utf8恰好适用于天成文书,如您的示例所示。
https://stackoverflow.com/questions/68874060
复制相似问题