How to enable multiple Symbol generation on parent ERC721 Upgradeable contract

I am updating to Upgradeable the template of an ERC721 that is used by a contract factory. As of now the template does not define a symbol because it is supposed to be defined by the user each time the factory creates the ERC721 contract from the template. However, Im using the wizard and it requires to have the symbol specified.

:1234: Code to reproduce

This is the base contract:

pragma solidity >=0.6.0 <0.8.4;
//SPDX-License-Identifier: MIT

//import "hardhat/console.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/utils/Counters.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol";

abstract contract MyNft is ERC721, ERC721URIStorage, Ownable {
    address licensor = owner();
    uint256 licenseCost = 10000000000000000;
    string[] IP;

    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;

    constructor(
        string memory IpBrandName,
        string memory IpBrandSymbol,
        string memory IpURI
    ) public ERC721(IpBrandName, IpBrandSymbol) {
        _baseURI();
        IP.push(IpURI);
    }

    function _baseURI() internal pure override returns (string memory) {
        return "ipfs://";
    }

    function _burn(uint256 tokenId)
        internal
        override(ERC721, ERC721URIStorage)
    {
        super._burn(tokenId);
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override(ERC721, ERC721URIStorage)
        returns (string memory)
    {
        return super.tokenURI(tokenId);
    }
    /**
     * @dev Mint Licensee a License
     * @return token id of license
     **/
    function licenseIP() public payable returns (uint256) {
        require(msg.value == licenseCost);
        _tokenIds.increment();
        uint256 id = _tokenIds.current();
        _mint(msg.sender, id);
        _setTokenURI(id, IP[0]);
        return id;
    }

    /**
     * @dev Change the user and owner of the contract
     * @param newUser address of the new user
     **/
    function changeUser(address newLicensor) public onlyOwner {
        transferOwnership(newUser);
    }

    /**
     * @dev Change cost of Use
     * @param newUseCost New price for use
     **/
    function changeUseCost(uint256 newUseCost)
        public
        onlyOwner
        returns (uint256)
    {
        useCost = newUseCost;
        return useCost;
    }
}

My question is:

What is the best way to adjust the symbol requirement and what is the effect of leaving the symbol empty as in:

    function initialize() initializer public {
        __ERC721_init("MyToken", "");
        __ERC721URIStorage_init();
        __Pausable_init();
        __AccessControl_init();
        __ERC721Burnable_init();

        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(PAUSER_ROLE, msg.sender);
        _setupRole(MINTER_ROLE, msg.sender);
    }

?

:computer: Environment

Im using Remix with the 0.8.2 compiler