首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >声明为NVARCHAR的列在MySQL中被创建为VARCHAR。VARCHAR和NVARCHAR声明都可以存储非拉丁字符

声明为NVARCHAR的列在MySQL中被创建为VARCHAR。VARCHAR和NVARCHAR声明都可以存储非拉丁字符
EN

Stack Overflow用户
提问于 2021-08-21 14:49:05
回答 2查看 146关注 0票数 1

我无法在MySQL中创建NVARCHAR数据类型。

我有以下疑问:

代码语言:javascript
运行
复制
CREATE TABLE table1 ( column1 NVARCHAR(10) );

这将创建存储数据类型NVARCHAR(10)column1。但是这个问题-

代码语言:javascript
运行
复制
DESCRIBE table1;

给了我输出-

代码语言:javascript
运行
复制
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column1 | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

因此,创建了可以存储NVARCHAR(10)数据类型的column1,而不是可以存储VARCHAR(10)数据类型的column1。

现在,假定只有NVARCHAR数据类型存储非拉丁字符。

但是这个问题-

代码语言:javascript
运行
复制
INSERT INTO table1 VALUES ("भारत");

成功运行,没有任何错误。这里的"भारत“是一个印地语单词,它在英语中听起来像”巴拉特“,翻译过来就是”印度“。

该查询-

代码语言:javascript
运行
复制
SELECT * FROM table1;

如预期的那样显示-

代码语言:javascript
运行
复制
+--------------+
| column1      |
+--------------+
| भारत         |
+--------------+

我猜可能是MySQL在内部将VARCHAR视为NVARCHAR。但我找不到任何说明这一点的文件。

以下是来自MySQL开发人员网站的链接-

https://dev.mysql.com/doc/refman/8.0/en/charset-national.html

这里说NVARCHAR是完全受支持的。

为了找出非拉丁字符是否可以存储在定义为VARCHAR的列中,我运行了以下查询:

代码语言:javascript
运行
复制
CREATE TABLE table2 ( column2 VARCHAR(10) );
DESCRIBE table2;

这给了我的输出-

代码语言:javascript
运行
复制
+---------+-------------+------+-----+---------+-------+
| Field   | Type        | Null | Key | Default | Extra |
+---------+-------------+------+-----+---------+-------+
| column2 | varchar(10) | YES  |     | NULL    |       |
+---------+-------------+------+-----+---------+-------+

在这里,可以存储VARCHAR(10)数据类型的column2如期创建。

运行查询-

代码语言:javascript
运行
复制
INSERT INTO table2 VALUES ("भारत");

运行时没有任何错误。

而这个查询-

代码语言:javascript
运行
复制
SELECT * FROM table2;

给出预期的输出-

代码语言:javascript
运行
复制
+--------------+
| column2      |
+--------------+
| भारत         |
+--------------+

因此,即使我将column2声明为VARCHAR(10),我也可以成功地存储非拉丁字符(这里是印地语的梵文字符)。

最合理的结论是,无论将列声明为VARCHAR还是NVARCHAR,MySQL始终在内部将其存储为NVARCHAR。但我找不到任何与此相关的文档。

下面的堆栈溢出问题最接近我的问题-

Issue Converting varchar to nvarchar mysql

但这个问题并没有得到答案。

我使用的是操作系统Ubuntu20.04和MySQL版本- 8.0.26

EN

Stack Overflow用户

发布于 2021-08-21 17:01:22

养成使用SHOW CREATE TABLE而不是DESCRIBE的习惯。它会回答你的问题。

代码语言:javascript
运行
复制
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

所以,你应该说

代码语言:javascript
运行
复制
CREATE TABLE nv ( column1 VARCHAR(10) CHARACTER SET utf8mb4 );

也就是说,不要使用NVARCHAR,而要使用VARCHAR并指定适当的字符集。

utf8恰好适用于天成文书,如您的示例所示。

票数 1
EN
查看全部 2 条回答
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/68874060

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档