MySQL - VARCHAR



MySQL Varchar 資料型別

MySQL 的 VARCHAR 資料型別用於儲存可變長度的字元字串,長度最長可達 65,535 位元組。

在 MySQL 中,當您將文字儲存在 VARCHAR 列中時,它需要一些額外的空間來跟蹤文字的長度。此額外空間可以是 1 或 2 個位元組,具體取決於文字的長度。如果文字較短(少於 255 個字元),則使用 1 個位元組表示長度。對於較長的文字,它使用 2 個位元組。

表中一行的資料總大小加上長度資訊不能超過 65,535 位元組。

示例

在下面的查詢中,我們正在建立一個名為 test_table 的新表,該表有兩個列 column1column2

正如我們在下面的程式碼塊中看到的,列(column1 = 32765 和 column2 = 32766)構成 65531 位元組。這些列將分別佔用 2 個位元組作為長度字首。因此,這些列總共構成 32765+2+32766+2 = 65535 位元組 -

CREATE TABLE test_table (
   column1 VARCHAR(32765) NOT NULL,
   column2 VARCHAR(32766) NOT NULL
)CHARACTER SET 'latin1' COLLATE LATIN1_DANISH_CI;

輸出

以下是上述程式碼的輸出 -

Query OK, 0 rows affected (0.03 sec)

示例

現在,讓我們建立另一個表 test_table2 併為兩個列(column1 和 column2)提供 32766 和 32766 -

CREATE TABLE test_table2 (
   column1 VARCHAR(32766) NOT NULL, --error
   column2 VARCHAR(32766) NOT NULL
)CHARACTER SET 'latin1' COLLATE LATIN1_DANISH_CI;

輸出

正如我們在下面的輸出中看到的,會生成一個錯誤,因為行大小(32766 +2 +32766 +2 = 65536)超過了最大限制(65,535) -

ERROR 1118 (42000): Row size too large. The maximum row size for the used 
table type, not counting BLOBs, is 65535. This includes storage overhead, 
check the manual. You have to change some columns to TEXT or BLOBs

示例

這裡,我們正在使用以下查詢建立另一個名為 CUSTOMERS 的表 -

CREATE TABLE CUSTOMERS (
   ID int PRIMARY KEY AUTO_INCREMENT,
   NAME VARCHAR(3)
);

獲得的輸出如下 -

Query OK, 0 rows affected (0.03 sec)

現在,我們將一個字串插入到 NAME 列中,其中長度大於 VARCHAR 列的長度 -

INSERT INTO CUSTOMERS (NAME) VALUES ('Rahul');

輸出

結果,MySQL 將生成以下錯誤 -

ERROR 1406 (22001): Data too long for column 'NAME' at row 1

示例

MySQL 在插入值時不會計算尾隨空格。相反,它會截斷尾隨空格。

讓我們將一個包含尾隨空格的值插入到 NAME 列中 -

INSERT INTO CUSTOMERS (NAME) VALUES ('ABC ');

輸出

正如我們在下面的輸出中看到的,MySQL 發出了一個警告 -

Query OK, 1 row affected, 1 warning (0.02 sec)

示例

在下面的查詢中,我們試圖檢查 NAME 列中值的長度 -

SELECT ID, NAME, length(NAME) FROM CUSTOMERS;

產生的結果如下 -

ID NAME length(NAME)
1 ABC 3

現在,讓我們執行以下查詢以顯示在上述插入操作中發出的警告 -

SHOW warnings;

產生的結果是 -

級別 程式碼 訊息
注意 1265 第 1 行的“NAME”列資料被截斷

使用客戶端程式的 Varchar 資料型別

除了使用 mysql 查詢執行資料型別外,我們還可以使用客戶端程式建立 Varchar 資料型別的列。

語法

要透過 PHP 程式建立 Varchar 資料型別的列,我們需要使用 mysqli 函式 query() 執行“CREATE TABLE”語句,如下所示 -

$sql ="CREATE TABLE customers (cust_Name VARCHAR(30), cust_Address varchar(50)) ";
$mysqli->query($sql);

要透過 JavaScript 程式建立 Varchar 資料型別的列,我們需要使用 mysql2 庫的 query() 函式執行“CREATE TABLE”語句,如下所示 -

sql = "CREATE TABLE customers (cust_Name VARCHAR(30), cust_Address varchar(50))";
con.query(sql);  

要透過 Java 程式建立 Varchar 資料型別的列,我們需要使用 JDBC 函式 execute() 執行“CREATE TABLE”語句,如下所示 -

String sql = "CREATE TABLE customers (cust_Name VARCHAR(30), cust_Address varchar(50))";
statement.execute(sql);

要透過 python 程式建立 Varchar 資料型別的列,我們需要使用 MySQL Connector/Pythonexecute() 函式執行“CREATE TABLE”語句,如下所示 -

sql = 'CREATE TABLE test_table (column1 VARCHAR(32765) NOT NULL,  column2 VARCHAR(32766) NOT NULL)CHARACTER SET 'latin1' COLLATE LATIN1_DANISH_CI'    
cursorObj.execute(sql)

示例

以下是程式 -

$dbhost = 'localhost';
$dbuser = 'root';
$dbpass = 'password';
$dbname = 'TUTORIALS';
$mysqli = new mysqli($dbhost, $dbuser, $dbpass, $dbname);
if ($mysqli->connect_errno) {
    printf("Connect failed: %s
", $mysqli->connect_error); exit(); } // printf('Connected successfully.
'); //create a customer table and use varchar data type with differenet size $sql = "CREATE TABLE customers (cust_Name VARCHAR(30), cust_Address varchar(50)) "; if ($mysqli->query($sql)) { echo "Table created successfully with varchar data!\n"; } if ($mysqli->errno) { printf("table could not create table: %s
", $mysqli->error); } $mysqli->close();

輸出

獲得的輸出如下 -

Table created successfully with varchar data!        
var mysql = require("mysql2");
var con = mysql.createConnection({
  host: "localhost",
  user: "root",
  password: "password",
}); //Connecting to MySQL

con.connect(function (err) {
  if (err) throw err;
  //   console.log("Connected successfully...!");
  //   console.log("--------------------------");
  sql = "USE TUTORIALS";
  con.query(sql);

  //create a customer table and use varchar data type with differenet size
  sql = "CREATE TABLE customers (cust_Name VARCHAR(30), cust_Address varchar(50)) ";
  con.query(sql);

  sql = `SELECT DATA_TYPE FROM INFORMATION_SCHEMA.COLUMNS WHERE table_name = 'customers' AND COLUMN_NAME = 'cust_Name'`;
  con.query(sql, function (err, result) {
    if (err) throw err;
    console.log(result);
  });
});  

輸出

產生的輸出如下 -

[ { DATA_TYPE: 'varchar' } ]
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.Statement;

public class Varchar {
   public static void main(String[] args) {
      String url = "jdbc:mysql://:3306/TUTORIALS";
      String username = "root";
      String password = "password";
      try {
         Class.forName("com.mysql.cj.jdbc.Driver");
         Connection connection = DriverManager.getConnection(url, username, password);
         Statement statement = connection.createStatement();
         System.out.println("Connected successfully...!");

         //varchar data types...!;
         String sql = "CREATE TABLE customers (cust_Name VARCHAR(30), cust_Address varchar(50))";
         statement.execute(sql);
         System.out.println("column of a varchar type created successfully...!");
         ResultSet resultSet = statement.executeQuery("DESCRIBE customers");
         while (resultSet.next()){
            System.out.println(resultSet.getString(1)+" "+resultSet.getString(2));
         }
         connection.close();
      } catch (Exception e) {
         System.out.println(e);
      }
   }
}  

輸出

獲得的輸出如下所示 -

Connected successfully...!
column of a varchar type created successfully...!
cust_Name varchar(30)
cust_Address varchar(50)  
import mysql.connector
# Establishing the connection
connection = mysql.connector.connect(
    host='localhost',
    user='root',
    password='password',
    database='tut'
)
# Creating a cursor object
cursorObj = connection.cursor()
# Create table with varchar column
sql = '''
CREATE TABLE test_table (
column1 VARCHAR(32765) NOT NULL,
column2 VARCHAR(32766) NOT NULL
)
CHARACTER SET 'latin1' COLLATE LATIN1_DANISH_CI
'''
cursorObj.execute(sql)
print("The table is created successfully!")
# Insert data into the created table
insert_query = "INSERT INTO test_table (column1, column2) VALUES (%s, %s)"
data_to_insert = ("History", "Geography")
cursorObj.execute(insert_query, data_to_insert)
# Commit the changes after the insert operation
connection.commit()
print("Rows inserted successfully.")
# Now display the table records
select_query = "SELECT * FROM test_table"
cursorObj.execute(select_query)
result = cursorObj.fetchall()
print("Table Data:")
for row in result:
    print(row)
cursorObj.close()
connection.close()  

輸出

以下是上述程式碼的輸出 -

The table is created successfully!
Rows inserted successfully.
Table Data:
('History', 'Geography')
廣告